javascript - 如何在javascript中复制引用的值?

标签 javascript pass-by-reference pass-by-value

前段时间我发布了一个关于 what questions should a good javascript coder be able to answer 的问题. Meder 指出了以下问题:

由于“i”作为引用而不是值保留在 onclick 函数中,因此以下代码会点击任何“a”元素以发出警报(-1):

<a href="#">text</a><br><a href="#">link</a>
<script>
var as = document.getElementsByTagName('a');
for ( var i = as.length; i--; ) {
    as[i].onclick = function() {
        alert(i);
        return false;
    }
}
</script>

The question is: How to fix this implementation so that the onclick function holds the value of i and not it's reference?

我不知道答案。如何解决?如何让 i 成为引用值的副本而不是实际引用?

附带问题:是否所有变量类型都作为引用传入?或者它是否因原始类型或对象而异?

如有任何想法,我们将不胜感激。

最佳答案

要理解这个问题,您必须了解什么是闭包。然后您还必须知道 javascript 如何处理作用域(它是基于函数而不是像 C 那样基于 block )。

这是“标准”解决方案:

<a href="#">text</a><br><a href="#">link</a>
<script type="text/javascript">
var as = document.getElementsByTagName('a');
for ( var i = as.length; i--; ) {
    as[i].onclick = (function(i) {
        return function() {
            alert(i);
            return false;
        }
    })(i);
}
</script>

另一个版本完全做同样的事情,但如果您不习惯 JS 中的闭包和作用域,可能更容易理解:

for ( var i = as.length; i--; ) {
    as[i].onclick = (function(number) {
        return function() {
            alert(number);
            return false;
        }
    })(i);

明白了吗?

关于javascript - 如何在javascript中复制引用的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1844262/

相关文章:

c++ - 编程风格 : object with passages by references or value? (c++)

c - 修改作为函数传入的字符串文字

javascript - jquery 中的 "closest()"方法不起作用

javascript - 如何使用 Javascript 从带有嵌套列表的 JSON 动态创建表?

Python 和 Java 参数传递

c++ - 参数中的指针和引用

javascript - Highcharts 仪表样式和添加 CSS 元素

javascript - 洛达什。如何过滤对象中的对象?

c - JNA 无符号整数引用给出了奇怪的结果

java - Ruby 是按值传递还是按引用传递?