замыкания терминологии и семантического сомнения - PullRequest
2 голосов
/ 04 декабря 2010

Если у меня есть следующий код:

function foo() 
{
    var a = [];
    for(var i = 0; i < 3; i++)
    {
        a[i] = function(x)
        {
            return function()
            {
                return x;
            }
        }(i);
    }
    return a;
}

замыкание создается, когда я вызываю (i) на каждой итерации или когда я определяю внутренние функции?

и затем лямбдавыражение является закрытием?

Спасибо.

Ответы [ 3 ]

1 голос
/ 04 декабря 2010

Закрытие создается благодаря тому факту, что вы возвращаете функцию, имеющую доступ к локальной переменной x, которая была определена как единственный член списка формальных параметров.

Таким образом, функции, хранящиеся в a[i], закрылись вокруг своего уникального x, который находился в той же области видимости, и как таковой, имеют к нему доступ. Поскольку эта переменная доступна только этой функции, которая была передана из функции, вызывающей саму себя, у вас есть замыкание.

Я бы отметил, что было бы лучше, если бы вы не использовали здесь самозапускающуюся анонимную функцию, поскольку она не нужна и добавляет накладные расходы. Вместо этого объявите именованную функцию и вызовите ее.

function foo() 
{
    var a = [];
    function retain_i(x)
    {
        return function()
        {
            return x;
        }
    }
    for(var i = 0; i < 3; i++)
    {
        a[i] = retain_i(i);
    }
    return a;
}

РЕДАКТИРОВАНИЕ: Чтобы быть более конкретным на ваш вопрос:

замыкание создается при вызове (i) на каждой итерации ...

Нет, это не создает закрытие. Закрытие создается, когда вы возвращаете функцию, которая закрылась вокруг параметра x, который в противном случае был бы недоступен вне функции, вызывающей себя.

Если бы вы не вернули эту функцию, у вас не было бы закрытия.

Итак, как вы можете видеть из приведенного мною примера кода, определение / объявление функции не создает замыкание. Скорее выполнение функции, которая выходит из нее какой-то другой функции, которая имеет доступ к недоступным в противном случае переменным, создает замыкание.

1 голос
/ 04 декабря 2010

замыкание создается, когда вы определяете функцию, а не когда вы ее запускаете - это называется лексической областью действия.

0 голосов
/ 04 декабря 2010

Замыкания создаются в определениях функций.

Поэтому в вашем примере они создаются дважды для каждой итерации - в первый раз, когда объявлен внешний function, и во второй раз, когдаон вызывается, определяя внутреннюю функцию.

Результатом, присваиваемым ячейке i массива, являются функции, возвращающие i.

Другой автор правильно назвал это "лексической" областью видимости- большинство современных языков, кажется, используют его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...