Объявление функции JavaScript или выражение вместе с возвратом вложенной функции - PullRequest
0 голосов
/ 18 декабря 2018

Этот код появляется в очень популярном учебнике по JS:

const sum = (function() {
  "use strict";
  return function sum(...args) {
    return args.reduce((a, b) => a + b, 0);
  };
})();
console.log(sum(1, 2, 3)); // 6
  1. Я пытаюсь понять причину, по которой они возвращают функцию из функции (объяснение там не приводится), к несчастью).Было бы проще и проще, если бы внешняя функция объявлялась с параметрами, выполняла вычисления, а затем просто возвращала значение.Почему возникает необходимость (в этом случае; кажется, что ответ на общий случай можно найти здесь ), чтобы выразить функцию таким образом?

  2. Есть ли причина, чтобы выразить функцию вместо того, чтобы объявить ее?то есть, чтобы выразить функцию как var, let или const вместо простого объявления ее с ключевым словом function?Каковы преимущества каждого способа?Я прочитал здесь , что, кроме подъема, это полностью стилистическое решение.Разве не было бы безопаснее всегда объявлять функции, а не выражать их?Я, должно быть, здесь упускаю что-то простое.

Ответы [ 4 ]

0 голосов
/ 19 декабря 2018

1 - это то, что называется IIFE .Выражение немедленного вызова функции.И у него есть несколько преимуществ: сначала это способ создания ООП-подобной функциональности, такой как частные и публичные функции, затем это способ заключать в себе вещи, чтобы они не загрязняли глобальное пространство имен.Что произойдет, если вы объявите глобальную функцию, а какая-то библиотека, которую вы используете, будет декалировать то же имя функции?Последний выигрывает, и это создает трудности для поиска ошибок.Это также способ создания модулей (подробнее о модулях здесь ).

2 - зависит от логики, использованной автором кода, и от того, как все организовано.Как правило, более кратким является использование переменных вместо функций.После появления функций массива это становилось все более и более распространенным.Но это по-прежнему ваш выбор.

0 голосов
/ 19 декабря 2018

В частичном ответе на номер 2 именованная функция сообщит свое имя в следах стека, в то время как анонимная функция, назначенная переменной или константе, не будет.Таким образом, это слегка благоприятствует только объявлению функций.

Однако вы можете назвать функцию и присвоить ее переменной или константе без каких-либо проблем, например:

let sum = function sum(...args) {
  return args.reduce((a, b) => a + b, 0)
}

Что, если вы предпочитаетеназначенные функции, дает вам лучшее из обоих миров.

0 голосов
/ 19 декабря 2018

Ваш первый вопрос: приведенная выше конструкция имеет смысл, когда функции используются для упаковки модуля и эмуляции области пространства имен (или пакета).Все локальные переменные top-function будут автоматически иметь «пакетную» область видимости.В приведенном выше примере это не используется, поэтому я также думаю, что это слишком сильный вопрос

о втором вопросе - анонимные fn, var и let имеют существенно различную видимость.Это часто имеет значение в дизайне и может помочь вам лучше контролировать то, что вам нужно.это единственная причина, о которой я могу думать.

0 голосов
/ 19 декабря 2018

Использование анонимной функции, которая вызывается немедленно, как в вашем примере, часто делается с единственной целью изолировать область вашего кода.В этом случае, в частности, использование "use strict" ограничивает строгий режим только кодом внутри функции верхнего уровня.

Как вы сказали, у вас может быть просто функция вместо двух, но результатне то же самое:

const sum = (function() {
  "use strict";
  var x = something(); // strict mode enforced here
  return function sum(...args) {
    return args.reduce((a, b) => a + b, 0);
  };
})();

И здесь:

var x = something(); // strict mode not enforced here
function sum() {
    "use strict";
    return arguments.reduce((a, b) => a + b, 0);
};

Кроме того, хотя во втором подходе функция обязательно должна быть объявлена ​​в глобальной области видимости, в первом подходе выможет иметь много функций, объявленных внутри функции верхнего уровня без загрязнения глобальной области видимости.

...