Доступ к скопированной целочисленной переменной в анонимном методе javascript

Я разработчик 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 -переменной. Затем на каждой итерации while я создаю совершенно новый указатель на функцию. Каждая функция ссылается на свою собственную копию i , которая называется contextCopy . Однако обе созданные функции по какой-то причине ссылаются на одну и ту же contextCopy -переменную.

Как это работает в JavaScript?

7
задан zzzzBov 21 November 2011 в 16:19
поделиться