JavaScript

Вопрос по JavaScript (фывпфыпыфвпфы)

var fn = (function() {
var numberOfCalls = 0;
return function() {
return ++ numberOfCalls;
}
})();

Какой смысл у () в последней строке?
Смысл в том, чтобы функция-инициализатор function() { var numberOfCalls = 0; ...} выполнилась и в качестве своего результата вернула функцию-счётчик function() { return ++ numberOfCalls; }. И именно эта функция-счётчик присваивается переменной fn.
Дмитрий Кудрявцев
Дмитрий Кудрявцев
82 283
Лучший ответ
Скобки в JavaScript имеют разное значение в зависимости от контекста. Когда они после имени функции, или функционального выражения - это оператор вызова.

Здесь у тебя функциональное выражение, сгруппированное скобками: (function () {…}) - если оставить вот так, то это выражение просто вернется "влево" и будет присвоено переменнной fn, вызов выполнен НЕ БУДЕТ. Ты можешь вызвать ниже, написав fn() - но тогда результат (возвращаемое функциональное выражение function() { return ++numberOfCalls; }) попадет "в никуда": оно так же будет возвращено влево, но на этот раз слева нет присваивания переменнной.
С оператором вызова, все сработает иначе: внешнее функциональное выражение ВЫПОЛНЯЕТСЯ и возвращает внутренее, в момент присваивания переменнной fn. Таким образом, в fn окажется ФР увеличивающее значение numberOfCalls при каждом вызове (а сама переменная numberOfCalls находится в замыкании возвращаемой анонимной функции - "извне", напрямую она недоступна).

Паттерн вида (function () {…})(); называется IIFE.

p.s.: Не рекомендую слушать тех, кто не отличает функциональное выражение от функции. В плане типа результата они одинаковы, но в остальном - разные вещи. Самое значительное отличие в том что ФР вычисляются динамически, создаются в процессе выполнения (а функции - статически), и могут быть анонимны (функции - не могут).
Иван Пономарев
Иван Пономарев
70 946
Иван Пономарев Незначительная поправка: там где написано "возвращается ФР" - подразумевается возврат новой функции. Думаю, это и так понятно, выражения вычисляются (как 2+2 вернет 4, а не 2+2, так и ФР возвращает результат, а не само себя).
убери эти скобки и попробуй вызвать fn(), получишь х-й
т. е. смысл в том чтобы вся камитель в скобках превратилось в функцию