Локальная функция в закрытии объявляет переменную с тем же именем, которое существует в закрытии. Так, как мы могли получить доступ к переменной закрытия от локальной функции?
function closure()
{
var xVar;
function func1()
{
var xVar;
// how to distinguish local and closure scopes.
return xVar;
}
return function () { return func1(); };
}
При создании частного объекта и создании частных переменных, поскольку свойства этого объекта могли помочь. Но я задаюсь вопросом, существует ли лучшее и аккуратное решение. Цепочка объема может помочь?
Я отредактировал для создания этого полным закрытием. Так или иначе закрытия не являются большим беспокойством здесь, это можно было рассмотреть для внутренних функций однако, может быть решение с закрытиями так или иначе.
Спасибо
В JS нельзя явно получить доступ к цепочке областей видимости. Ваша проблема - давняя проблема затенения переменных, но она намного более раздражает, потому что в JS цепочка областей видимости на самом деле там во время выполнения, она просто недоступна для вас.
Вы можете поиграть с изменением текущей области видимости, если используете ненавистный с оператором
, но этот (а также аргументы
вызывающий / вызываемый объект) действительно просто дает вам доступ к объектам и функциям с их свойствами. Невозможно сказать «отсюда дайте мне, что означает xVar в области времени выполнения n-1».
В вашем примере переменная xVar не является закрытием, потому что вы переопределили ее область действия для каждой функции. Чтобы использовать эту переменную в качестве замыкания, продолжайте объявлять ее с помощью команды var в функции closure (), а затем не объявляйте ее с помощью функции var в функции func1 (). Вместо этого просто используйте переменную сразу в func1 ().
Нет простого способа проверить, является ли функция замыканием или локальной переменной. Вам нужно будет выполнить какой-то тест управления потоком, а затем проанализировать назначения, где они происходят, а где нет. Затем вы должны сравнить эти результаты. Вы можете написать инструмент на JavaScript, чтобы выполнять этот анализ на заданном входе и писать вам отчет в качестве вывода.
Переменные, определенные во внутренней области видимости, скрывают объявления переменных во внешней области. «Лучшее и изящное решение» - не использовать таким образом имена переменных повторно.