Вопрос по замыканиям
Добрый вечер друзья, возник вопрос, скорей даже не вопрос, а полная неразбериха по теме замыканий (недавно в 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, время: 17:41. |