我想在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
现在它返回'正确'值。我是否正确地说它有效,因为函数在调用时解析了对它们的“常量”值的所有变量引用?或者有更好的解释方法吗?
对此参考/复制业务的解释的任何解释/链接也将受到赞赏。谢谢!
答案 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。