我是C#开发人员,习惯于C#中的闭包工作方式。
目前,我必须使用匿名javascript函数并遇到以下代码段问题:
function ClosureTest() {
var funcArray = new Array();
var i = 0;
while (i < 2) {
var contextCopy = i;
funcArray[i] = function() { alert(contextCopy); return false; };
i++;
}
funcArray[0]();
funcArray[1]();
}
我希望第一个
funcArray()
调用说0
,第二个调用1
。但是,他们都说1
。那怎么可能?通过编写
var contextCopy = i
,可以确保我创建了i
-variable的副本。然后,在每个while迭代中,我创建一个全新的函数指针。每个函数都引用自己的i
副本,即contextCopy
。但是,由于某些原因,两个创建的函数都引用相同的contextCopy
-variable。这在javascript中如何运作?
最佳答案
JavaScript具有词法闭包,而不是块闭包。即使您将i分配给contextCopy,contextCopy本身也是ClosureTest的词法成员(与C#不同,在C#中,{}给您一个新的作用域块)。试试这个:
while (i < 2) {
funcArray[i] = (function(value) {
return function(){ alert(value); return false; }
})(i);
i++;
}