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

标签 javascript closures

以下示例摘自“Javascript:好的部分”一书。作者说辅助函数返回一个绑定(bind)到 var i当前值 的函数。

谁能解释是什么让它绑定(bind)了 var i 的 VALUE 而不是 REFERENCE,因为 helper 函数是 add_the_handler 函数的闭包并且应该只看到 var i 的引用:

var add_the_handlers = function (nodes) {
   var helper = function (i) {
      return function (e) {
        alert(i);
      };
    };
    var i;
    for (i = 0; i < nodes.length; i += 1) {
       nodes[i].onclick = helper(i);
    }
};

最佳答案

如果你要说:

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

关于Javascript 闭包 - 绑定(bind)值而不是引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6728653/

相关文章:

javascript - 如何从 javascript 到 html 增加值?

javascript - 从静态文件夹获取图像文件并在客户端应用程序中显示它们

python - obj.__closure__ 中究竟包含什么?

JavaScript/jQuery 下拉列表更改事件与关闭不起作用

Javascript 属性检查器函数(使用闭包)

javascript - 将 scrapy 与 javascript __doPostBack 方法结合使用时出现问题

javascript - 使用变量源时无法将属性 'src' 设置为 null

javascript - 循环 JSON,将一些键存储在其他 JSON 对象中

php - 如何在PHP中定义一个带参数且不闭包的回调并使用?

javascript - 使用多个括号在 Javascript 中关闭