Я не понял ваш вопрос, сначала я обновляю свой ответ.
Объяснение: - Вы можете вставить функцию внутри функции. Вложенная (внутренняя) функция является частной для ее содержащей (внешней) функции. Он также образует закрытие .
Закрытие - это выражение (обычно функция), которое может иметь свободные переменные вместе со средой, которая связывает эти переменные (что «закрывает» выражение).
Поскольку вложенная функция является замыканием, это означает, что вложенная функция может «наследовать» аргументы и переменные содержащейся в ней функции. Другими словами, внутренняя функция содержит область внешней функции.
Резюмируя:
Внутренняя функция может быть доступна только из операторы внешней функции.
Внутренняя функция образует замыкание: внутренняя функция может использовать аргументы и переменные внешней функции, а внешняя функция не может использовать аргументы и переменные внутренней функции.
Следующий пример показывает, вложенные функции:
function addSquares(a,b) {
function square(x) {
return x * x;
}
return square(a) + square(b);
}
a = addSquares(2,3); // returns 13
b = addSquares(3,4); // returns 25
c = addSquares(4,5); // returns 41
Поскольку внутренняя функция образует замыкание, вы можете вызывать внешнюю функцию и указать аргументы как для внешней и внутренней функции:
function outside(x) {
function inside(y) {
return x + y;
}
return inside;
}
fn_inside = outside(3);
result = fn_inside(5); // returns 8
result1 = outside(3)(5); // returns 8
Сохранение переменных
Обратите внимание, что x сохраняется при возврате внутренней части. Закрытие должно сохранять аргументы и переменные во всех областях, на которые оно ссылается. Поскольку каждый вызов предоставляет потенциально разные аргументы, новое закрытие создается для каждого вызова внешним. Память может быть освобождена только тогда, когда возвращенная внутренняя часть больше не доступна.
Это не отличается от хранения ссылок в других объектах, но часто менее очевидно, потому что вы не устанавливаете ссылки напрямую и не можете их проверить.
Когда установлена глобальная переменная, она добавляется к объекту окна!
var myValue;
function setValue()
{
myValue = "test";
}
function getValue()
{
alert(window.myValue); // yup, it's "test"
}
Я хочу сказать в памяти, но я не думаю, что этого достаточно. – thgaskell
Любая переменная будет удаляться, когда она больше не будет доступна никаким «путём», начиная с глобального объекта, и это единственное правило. Время, когда это должно произойти, не указывается. Также не указывается способ хранения всех данных, но вам все равно, если вы не написали свой собственный механизм JavaScript или не настроили существующий. – GameAlchemist
просто интересует, где двигатель будет хранить эту локальную переменную, определенную во внешней функции, так как кажется, что жизненный цикл этой переменной не такой же, как и сама внешняя функция. – caesarwang