Вопрос по замыканиям
Добрый вечер друзья, возник вопрос, скорей даже не вопрос, а полная неразбериха по теме замыканий (недавно в JS). Что бы без длинных предысторий, сразу покажу код (взял из Википедии):
function createCounter() { var numberOfCalls = 0; return function() { return ++numberOfCalls; } } var fn = createCounter(); fn(); //1 fn(); //2 fn(); //3 Я понимаю, что этот код делает, но абсолютно не понимаю каким образом. Почему при вызове функции createCounter() не обнуляется переменная numberOfCalls? Зачем нужно копировать ссылку на функцию в переменную fn, почему ее нельзя вызвать напрямую? Сам по себе, этот код меня не волнует, но это самый простой пример замыкания, который я, к сожалению, не могу понять. Я бы был очень благодарен, если бы вы подробно объяснили мне ситуацию, как это все считывает интерпретатор. |
Цитата:
Цитата:
|
Цитата:
return ++numberOfCalls; При каждом вызове функции, выводит увеличенный на единицу (по сравнению с предыдущим вызовом) результат, то есть - не обнуляется. |
При вызове функции createCounter обнуляется. Она у вас только один раз вызывается.
|
Цитата:
|
Вот так будет работать как вы хотите, только это не имеет смысла))
function createCounter() { var numberOfCalls = 0; return function() { return ++numberOfCalls; } } var fn = createCounter; fn()(); //1 fn()(); //1 fn()(); //1 |
Цитата:
|
Цитата:
function() { return ++numberOfCalls; } Спасибо большое, вы очень помогли! Если бы еще понять вот этот синтаксис, fn()(), который все таки вызывает фукцию createCounter(), но я думаю, это уже не так проблематично. |
var fn = createCounter; Вот в чем дело, лол.) А по поводу fn()() - ты это сколько угодно: function џ() { return function() { return function() { return function() { return function() { return function() { return function() { return function() { alert('lol') } } } } } } } } џ()()()()()()()() хотя всё это фигнестрадание) |
Цитата:
|
Часовой пояс GMT +3, время: 09:33. |