var fn = (function() {
var numberOfCalls = 0;
return function() {
return ++ numberOfCalls;
}
})();
Какой смысл у () в последней строке?
JavaScript
Вопрос по JavaScript (фывпфыпыфвпфы)
Смысл в том, чтобы функция-инициализатор function() { var numberOfCalls = 0; ...} выполнилась и в качестве своего результата вернула функцию-счётчик function() { return ++ numberOfCalls; }. И именно эта функция-счётчик присваивается переменной fn.
Скобки в JavaScript имеют разное значение в зависимости от контекста. Когда они после имени функции, или функционального выражения - это оператор вызова.
Здесь у тебя функциональное выражение, сгруппированное скобками: (function () {…}) - если оставить вот так, то это выражение просто вернется "влево" и будет присвоено переменнной fn, вызов выполнен НЕ БУДЕТ. Ты можешь вызвать ниже, написав fn() - но тогда результат (возвращаемое функциональное выражение function() { return ++numberOfCalls; }) попадет "в никуда": оно так же будет возвращено влево, но на этот раз слева нет присваивания переменнной.
С оператором вызова, все сработает иначе: внешнее функциональное выражение ВЫПОЛНЯЕТСЯ и возвращает внутренее, в момент присваивания переменнной fn. Таким образом, в fn окажется ФР увеличивающее значение numberOfCalls при каждом вызове (а сама переменная numberOfCalls находится в замыкании возвращаемой анонимной функции - "извне", напрямую она недоступна).
Паттерн вида (function () {…})(); называется IIFE.
p.s.: Не рекомендую слушать тех, кто не отличает функциональное выражение от функции. В плане типа результата они одинаковы, но в остальном - разные вещи. Самое значительное отличие в том что ФР вычисляются динамически, создаются в процессе выполнения (а функции - статически), и могут быть анонимны (функции - не могут).
Здесь у тебя функциональное выражение, сгруппированное скобками: (function () {…}) - если оставить вот так, то это выражение просто вернется "влево" и будет присвоено переменнной fn, вызов выполнен НЕ БУДЕТ. Ты можешь вызвать ниже, написав fn() - но тогда результат (возвращаемое функциональное выражение function() { return ++numberOfCalls; }) попадет "в никуда": оно так же будет возвращено влево, но на этот раз слева нет присваивания переменнной.
С оператором вызова, все сработает иначе: внешнее функциональное выражение ВЫПОЛНЯЕТСЯ и возвращает внутренее, в момент присваивания переменнной fn. Таким образом, в fn окажется ФР увеличивающее значение numberOfCalls при каждом вызове (а сама переменная numberOfCalls находится в замыкании возвращаемой анонимной функции - "извне", напрямую она недоступна).
Паттерн вида (function () {…})(); называется IIFE.
p.s.: Не рекомендую слушать тех, кто не отличает функциональное выражение от функции. В плане типа результата они одинаковы, но в остальном - разные вещи. Самое значительное отличие в том что ФР вычисляются динамически, создаются в процессе выполнения (а функции - статически), и могут быть анонимны (функции - не могут).
Иван Пономарев
Незначительная поправка: там где написано "возвращается ФР" - подразумевается возврат новой функции. Думаю, это и так понятно, выражения вычисляются (как 2+2 вернет 4, а не 2+2, так и ФР возвращает результат, а не само себя).
убери эти скобки и попробуй вызвать fn(), получишь х-й
т. е. смысл в том чтобы вся камитель в скобках превратилось в функцию
т. е. смысл в том чтобы вся камитель в скобках превратилось в функцию
Похожие вопросы
- Помогите с вопросом про JavaScript Object
- Вопрос по JavaScript, обращение к функции, которая находится в функции...
- Вопрос по JavaScript, смотрите описание
- Вопрос по JavaScript!
- Есть ли аналоги JavaScript?
- С чего начать учить JavaScript?
- Подскажите книги для изучения javascript? Хочу начать изучать веб программирование javascript подойтет для начала?
- Зачем нужен prototype в JavaScript?
- Тяжело ли выучить JavaScript?
- Как создать квадрат через JavaScript?