我是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++;
}

08-16 22:56