4

前段时间我发布了一个问题,关于一个好的 javascript 编码器应该能够回答哪些问题。Meder 指出了以下问题:

由于“i”在 onclick 函数中作为引用而不是作为值保存,因此以下代码会单击任何“a”元素到 alert(-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>

问题是:如何修复这个实现,以便 onclick 函数保存 i 的值而不是它的引用?

我不知道答案。如何解决?如何使 i 成为参考值的副本而不是实际参考?

附带问题:是否所有变量类型都作为引用传入?或者它是基本类型还是对象?

任何想法将不胜感激。

4

2 回答 2

3

要理解这个问题,你必须了解什么是闭包。然后,您还必须知道 javascript 如何处理范围(例如,它是基于函数的,而不是基于块的,例如 C)。

这是“标准”解决方案:

<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);

明白了吗?

于 2009-12-04T01:39:46.140 回答
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() {
        return function() {
           alert(i);
           return false;
        }
    }();
}
</script>

也许?

于 2009-12-04T01:19:04.207 回答