在Javascript闭包中管理变量复制的规则是什么?

时间:2010-03-21 17:52:55

标签: javascript closures

我想在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 个答案:

答案 0 :(得分:1)

闭包变量在其作用域结束时被绑定(在闭包中“保存”),也就是说,当您离开定义闭包的函数时:

function make_closure() {
   var x = 10;
   var closure = function() { alert(x) }
   x = 20
   return closure;
}

func = make_closure()
func() // what do you think?

您找到的解决方案完全正确 - 您引入了另一个范围和强制关闭来绑定“内部”范围内的变量。

有关详细信息和说明,请参阅here