以下示例摘自“Javascript:The good parts”一书。作者说,辅助函数返回一个绑定到var i
的当前值的函数。
任何人都可以解释是什么使它绑定VALUE而不是var i
的参考,因为helper
函数是add_the_handler
函数的闭包,应该只看到{{1的引用}}:
var i
答案 0 :(得分:5)
如果你要说:
nodes[i].onclick = function(){ alert(i) };
该函数没有自己的i
副本,因为i
未在函数范围内声明。
为了帮助您更好地了解这一点,我修改了您的上述代码:
var add_the_handlers = function (nodes) {
var helper = function(t) {
// t is in the scope of "helper"
return function(e){
// e is in the scope of this anonymous function
// and is not used
alert(t);
};
};
// Variables declared here are in the scope of "add_the_handlers"
var i;
for (i = 0; i < nodes.length; i += 1) {
nodes[i].onclick = helper(i);
}
};
在“现实世界”中,您经常会看到如上所示的代码缩写为:
var add_the_handlers = function(nodes){
var i;
for(i = 0; i < nodes.length; i++)
nodes[i].onclick = (function(i){ return function(e){ alert(i); }; })(i);
};
答案 1 :(得分:1)
您将i
的当前值传递给函数helper
。在该函数内部,变量i
是函数的一个(容易混淆的命名)参数,与任何其他i
不同。因此返回的闭包绑定到特定的i
(实际上是包含i
的[[scope]],但是......)。
快乐的编码。
答案 2 :(得分:0)
这是一个猜测:i
是一个原语,因此它总是按值访问,而不是通过引用访问。