JavaScript: Почему закрытие происходит только в том случае, если я назначаю функцию return переменной?
Даже после чтения Вы не знаете JS и JavaScript: Core Я все еще не мог понять поведение следующего кода.
Почему, когда я вызываю counter()()
, я не получаю никакого закрытия, но если я назначу переменную для результата counter()
, например var getClosure = counter()
, тогда я получаю замыкание при вызове getClosure()
?
function counter() {
var _counter = 0;
function increase() { return _counter++ }
return increase;
}
// Double ()() to call the returned function always return 0, so no closure.
counter()() // returns 0
counter()() // returns 0
counter()() // returns 0
counter()() // returns 0
var createClosure = counter();
createClosure() // returns 0
createClosure() // returns 1
createClosure() // returns 2
createClosure() // returns 3
Ответы
Ответ 1
_counter
является локальной переменной внутри функции counter()
. Каждый раз, когда вы вызываете counter()
, будет создан новый _counter
.
Но var createClosure = counter()
только называется функцией 1 раз, поэтому _counter
не создается вновь каждый раз и "запоминается" там (что происходит закрытие)
Ответ 2
Каждый раз вы вызываете counter()()
, он создает новую функцию и новое замыкание.
Таким образом, результат всегда 0
.
Наоборот, когда var createClosure = counter();
выполняется, создается функция и замыкание и сохраняется в переменной createClosure
. В следующий раз, когда вы вызываете createClosure()
, вызывается сохраненный и создается закрытое закрытие. Поэтому результаты 0
, 1
, 2
, 3
,...
Ответ 3
Иными словами, возвращаемое значение функции counter()
, которая является закрытием, не сохраняется или, скорее, отбрасывается, когда вы просто вызываете функцию как есть.
Однако после присвоения этого возвращаемого значения
var createClosure
. Вы можете вызвать закрытие столько раз, сколько необходимо