2013-09-08 2 views
3

Если замыкание возвращается во внешней функции и что замыкание относится к некоторым переменным, определенным в этой внешней функции, является ли внешняя функция возвращена после оператора возврата?, где система хранит переменную, указанную замыканием

А поскольку закрытие по-прежнему имеет доступ к переменным, где система хранит эти переменные?

спасибо!

+0

Я хочу сказать в памяти, но я не думаю, что этого достаточно. – thgaskell

+0

Любая переменная будет удаляться, когда она больше не будет доступна никаким «путём», начиная с глобального объекта, и это единственное правило. Время, когда это должно произойти, не указывается. Также не указывается способ хранения всех данных, но вам все равно, если вы не написали свой собственный механизм JavaScript или не настроили существующий. – GameAlchemist

+0

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

ответ

-1

Я не понял ваш вопрос, сначала я обновляю свой ответ.

Объяснение: - Вы можете вставить функцию внутри функции. Вложенная (внутренняя) функция является частной для ее содержащей (внешней) функции. Он также образует закрытие .

Закрытие - это выражение (обычно функция), которое может иметь свободные переменные вместе со средой, которая связывает эти переменные (что «закрывает» выражение).

Поскольку вложенная функция является замыканием, это означает, что вложенная функция может «наследовать» аргументы и переменные содержащейся в ней функции. Другими словами, внутренняя функция содержит область внешней функции.

Резюмируя:

Внутренняя функция может быть доступна только из операторы внешней функции.

Внутренняя функция образует замыкание: внутренняя функция может использовать аргументы и переменные внешней функции, а внешняя функция не может использовать аргументы и переменные внутренней функции.

Следующий пример показывает, вложенные функции:

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" 
} 
+0

Я говорю о не глобальной переменной, я говорю о локальной переменной, определенной во внешней функции и ссылающейся на закрытие. – caesarwang

+0

вы знаете, что каждая вещь является объектом в javascript, функции также. и все они связаны определенным образом. вы можете просмотреть эту иерархию в firebug, открыв окно dom. – developerCK

+0

mozilla использует обезьяну паука как механизм javascript. и вы можете посетить здесь: https: //developer.mozilla.org/en-US/docs/SpiderMonkey/Internals – developerCK

1

Каждое закрытие создаст новый класс/функции, наконец и каждой переменной, которая ссылается на закрытие будет один из его полей/свойств так, нет, не будет мусора он будет собран сборщиком мусора когда экземпляр класса/функции вашего закрытия не имеет ссылки

+0

Внешний объект будет включен в контекст выполнения внутренней функции (закрытия) при вызове внутренней функции. –

+0

Когда вы говорите внешний объект, вы имеете в виду внешнюю функцию? – caesarwang

+0

Каждая функция в JavaScript также содержит все переменные в содержащей функции. Таким образом, даже если внешний объект получает сбор мусора, функция закрытия все еще имеет эти переменные. Это приятное объяснение: http://www.smartik.net/2013/07/Closures-CSharp-vs-JS-Same-But-Different.html. – FarmerBob

Смежные вопросы