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

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

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

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

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

Спасибо

6
задан Carl Manaster 27 February 2010 в 16:07
поделиться

3 ответа

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

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

3
ответ дан 17 December 2019 в 07:03
поделиться

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

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

0
ответ дан 17 December 2019 в 07:03
поделиться

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

1
ответ дан 17 December 2019 в 07:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: