Различение замыкания и локальных переменных

Локальная функция в замыкании объявляет переменную с тем же именем, которое существует в замыкании. Итак, как мы можем получить доступ к переменной закрытия из локальной функции?

function closure()
{
    var xVar; 
    function func1()
    {
        var xVar;
        // how to distinguish local and closure scopes.
        return xVar;
    }
    return function () { return func1(); };
}

Может помочь создание частного объекта и создание частных переменных в качестве свойств этого объекта. Но мне интересно, есть ли лучшее и изящное решение. Может ли помочь цепочка областей видимости?

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

Спасибо


person lockedscope    schedule 27.02.2010    source источник


Ответы (3)


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

Вы можете сыграть некоторые трюки с изменением текущей области видимости, если вы используете ненавистный оператор with, но это (а также материал вызывающего / вызываемого arguments) действительно просто дает вам доступ к объектам и функциям с их свойствами. Невозможно сказать «отсюда дайте мне, что означает xVar в области времени выполнения n-1».

person Ben Zotto    schedule 27.02.2010

Переменные, определенные во внутренней области, скрывают объявления переменных во внешней области. «Лучшее и изящное решение» - не использовать таким образом имена переменных повторно.

person JSBձոգչ    schedule 27.02.2010

В вашем примере переменная xVar не является закрытием, потому что вы переопределили ее область действия для каждой функции. Чтобы использовать эту переменную в качестве замыкания, продолжайте объявлять ее с помощью команды var в функции closure (), а затем не объявляйте ее с помощью функции var в функции func1 (). Вместо этого просто используйте переменную сразу в func1 ().

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

person Community    schedule 27.02.2010
comment
Думаю, он это знает. Вопрос в том, из кода внутри func1, как бы вы явно сослались на xVar, определенный в замыкании (а не на xVar, определенный в func1)? - person Pointy; 27.02.2010
comment
Я ответил на это в первом абзаце. - person ; 27.02.2010