2

Я пытаюсь понять закрытие, и я смотрю учебник javascript W3Schools. Это один из примеров, которые они дают, создавая счетчик.нужно больше объяснений на примере закрытия w3schools javascript

<body> 

<p>Counting with a local variable.</p> 

<button type="button" onclick="myFunction()">Count!</button> 

<p id="demo">0</p> 

<script> 
var add = (function() { 
    var counter = 0; 
    return function() {return counter += 1;} 
})(); 

function myFunction(){ 
    document.getElementById("demo").innerHTML = add(); 
} 
</script> 

</body> 

Пример Объяснение Переменная добавить присваивается значение, возвращаемое самостоятельного вызова функции.

Функция самозапуска только запускается один раз. Он устанавливает счетчик в (0) и возвращает выражение функции.

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

Это называется закрытие JavaScript. Это позволяет для функции иметь «частные» переменные.

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

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

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

+0

Это просто, как w3schools написал пример. Он работает, хотя вот ссылка на окно «Попробовать». http://www.w3schools.com/js/tryit.asp?filename=tryjs_function_counter3. Попробуйте код. Оно работает. – Spilot

+0

Позвольте мне изменить это .... – Spilot

ответ

1

Концепция замыканий может быть объяснена как функция и их контексты. Контекст - это своего рода хранилище, прикрепленное к функции для разрешения захваченных переменных (таким образом, называется закрытием?).

Когда пример кода выполняется:

var add = (function() { 
    var counter = 0; // This is promoted to the below's function context 
    return function() {return counter += 1;} 
})(); 

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

Эта диаграмма более или менее объясняет:

JS Functions and Context

В этом случае Х и Y захватываются контексте функции и осуществляется по всем выполнений этой функции.

Теперь это только реализация V8 lexical environments.

См Вячеслав Егоров большое объяснение реализаций закрывающих с использованием V8: Grokking V8 closures for fun (and profit?)