Прям фиг знает, как объяснить
function createCounter() {
var numberOfCalls = 0;
return function() {
return ++numberOfCalls;
}
}
var fn = createCounter();
alert(fn);
Т.е. в первом случае fn - это функция, которая имеет в себе типа локальную переменную numberOfCalls, доступную внутри функции. И каждый вызов fn увеличивает ее значение на единицу и возвращает его. Поэтому после 3х вызовов функция возвращает 3.
А второй пример кривоват. Вызов createCounter() ничего не дает в первых двух случаях.
function createCounter() {
var numberOfCalls = 0;
return function() {
return ++numberOfCalls;
}
}
alert(createCounter());
Если же вызвать функцию, которую возвращает createCounter(), то она вернет один и благополучно умрет, так что многократный вызов createCounter()() не даст того же эффекта, что и многократный вызов fn().
Ну или тип того