代码之家  ›  专栏  ›  技术社区  ›  int3

什么规则控制javascript闭包中变量的复制?

  •  1
  • int3  · 技术社区  · 15 年前

    我只想检查一下我对javascript中变量复制的理解。据我所知,变量是通过引用传递/分配的,除非您明确告诉它们使用 new 操作员。但在使用闭包时,我有点不确定。假设我有以下代码:

    var myArray = [1, 5, 10, 15, 20];
    var fnlist = [];
    for (var i in myArray) {
        var data = myArray[i];
        fnlist.push(function() {
            var x = data;
            console.log(x);
        });
    }
    fnlist[2](); // returns 20
    

    我想这是因为 fnlist[2] 只查找 data 在调用它的点上。所以我尝试了另一种方法:

    var myArray = [1, 5, 10, 15, 20];
    var fnlist = [];
    for (var i in myArray) {
        var data = myArray[i];
        fnlist.push(function() {
            var x = data;
            return function() {
                console.log(x);         
            }
        }());
    }
    fnlist[2](); // returns 10
    

    所以现在它返回“正确”的值。我说它工作是因为函数在被调用时将所有变量引用解析为它们的“常量”值,这对吗?或者有更好的解释方法吗?

    如有任何关于本参考/复印业务的解释/链接,也将不胜感激。谢谢!

    1 回复  |  直到 15 年前
        1
  •  1
  •   user187291    15 年前

    闭包变量在其作用域结束时(即离开定义闭包的函数时)被绑定(保存在闭包中):

    function make_closure() {
       var x = 10;
       var closure = function() { alert(x) }
       x = 20
       return closure;
    }
    
    func = make_closure()
    func() // what do you think?
    

    您找到的解决方案是完全正确的——您引入了另一个作用域并强制闭包绑定该“内部”作用域中的变量。

    here 详情和解释。