Отличительное замыкание и локальные переменные - PullRequest
6 голосов
/ 27 февраля 2010

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

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

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

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

Спасибо

Ответы [ 3 ]

3 голосов
/ 27 февраля 2010

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

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

1 голос
/ 27 февраля 2010

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

0 голосов
/ 27 февраля 2010

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

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

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