Как называется анонимная функция JavaScript, которая вызывается немедленно?

29

Я пишу руководство по стилю JavaScript для моей команды, чтобы мы могли упростить организацию и предоставление документов. Но я столкнулся с небольшим ударом, к которому относится мой вопрос ...

Что я должен вызывать анонимную функцию JavaScript, которая вызывается немедленно. Я знаю, что могу просто назвать это «анонимной функцией», но я хотел бы подчеркнуть тот факт, что она вызывается немедленно.

Вот пример:

var MyVariable = (function(data){
  return "another value"
})("some value"); 

console.log(MyVariable);
// "another value"
silentBeep
источник
1
Обратите внимание, что вы часто будете видеть эту конструкцию (неточно), называемую «функцией
самовызвания

Ответы:

39

У них уже есть термин для этого в мире Javascript. Они называются выражениями немедленного вызова функций (IIFE) .

Что это

Функции IIFE не имеют названия. Вместо этого они выполняются один раз, когда интерпретатор сталкивается с ними:

var area = function() {
    var width = 3;
    var height = 2;
    return width * height;
}();

В заключительных круглых скобках после закрывающей фигурной скобки блока кода скажите интерпретатор немедленно вызвать выражение функции.

Если вы пишете объявление функции, вы должны добавить операторы группировки или круглые скобки, окружающие функцию, чтобы сказать интерпретатору обрабатывать функцию как выражение, которое может быть немедленно вызвано:

var area;
(function() {
    var width = 3;
    var height = 2;
    area = width * height;
}());


Когда они используются

IIFE используются для кода, который должен запускаться только один раз внутри задачи, а не вызываться повторно.

  1. В качестве аргумента при вызове функции (для вычисления значений и т. Д.)
  2. Чтобы присвоить значение свойства объекту.
  3. В обработчиках событий и слушателях.
  4. Для предотвращения конфликтов между двумя сценариями, которые могут использовать одинаковые имена переменных. Их можно использовать как оболочки для удаления кода в другом скрипте, где вы не уверены, что имена переменных могут совпадать.
Лоуренс Айелло
источник
Один нюанс: в вашем примере использования var area = ...вам не нужны «заключающие» скобки в функцию, потому что это уже выражение функции в силу того, что оно находится справа от =. Оберточные скобки нужны только тогда, когда функция написана как объявление функции (т.е. без начального var area = ...).
Эрик Кинг
@EricKing я сделал это правильно?
Лоуренс Айелло
Было бы неплохо иметь возможность более небрежно вызывать эти «экспресс-функции»
фильтр
@LawrenceAiello Я добавил редактирование, чтобы показать, что я имел в виду. Надеюсь, это все еще работает для вас.
Эрик Кинг,
В качестве связанного вопроса, есть ли основания для передачи аргумента в IIFE, как показывает вопрос? Я только когда-либо видел это, как вы демонстрируете - без каких-либо аргументов (поскольку любой аргумент может быть локальной переменной).
Кат