Подтвердить что ты не робот

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
4b9b3361

Ответ 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. Вы можете вызвать закрытие столько раз, сколько необходимо