Javascript闭包 - 绑定值而不是引用

时间:2011-07-18 04:32:44

标签: javascript closures

以下示例摘自“Javascript:The good parts”一书。作者说,辅助函数返回一个绑定到var i当前值的函数。

任何人都可以解释是什么使它绑定VALUE而不是var i的参考,因为helper函数是add_the_handler函数的闭包,应该只看到{{1的引用}}:

var i

3 个答案:

答案 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是一个原语,因此它总是按值访问,而不是通过引用访问。