2009-12-04 39 views
4

前段时间我发布了一个关于what questions should a good javascript coder be able to answer的问题。 Meder指出以下问题:如何在JavaScript中复制参考值?

由于“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的值修正这个 实现的,不能 它的参考?

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

小问题:所有变量类型都作为参考传入吗?或者它是否是原始类型还是对象?

任何想法将不胜感激。

+0

这是最常见的问题之一,请查看我的回答和在这个问题中的评论:http://stackoverflow.com/questions/1804438/#1804452 – CMS 2009-12-04 01:24:06

回答

3

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

这里的“stantard”的解决方案:

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

有想法吗?

+0

明白了!谢谢! – 2009-12-04 15:17:06

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> 

也许?

+1

你几乎*那里...提示:你有通过将它作为参数传递给自我执行函数来捕获'i'变量... – CMS 2009-12-04 01:28:16