Сразу же вызванное выражение функции в javascript - PullRequest
1 голос
/ 14 февраля 2020

В чем причина помещения () в конец выражения для немедленного вызова функции в javascript

(function() {
    // Code that runs in your function
})( /* this parenthesis in the end */ )

Ответы [ 2 ]

2 голосов
/ 14 февраля 2020

выражение немедленного вызова функции : a:

(function() { ... })выражение функции значение немедленное вызывание ()

Чтобы уточнить, (function() { ... }) - это просто , определяющий функцию, а функция, которая определена, но никогда не вызывается, абсолютно ничего не делает.

Для кода в Чтобы выполнить функцию, она должна быть вызвана (часто называемая , вызывающая функцию). Вот почему вы заключаете определение функции в скобки (делая его выражением, которое оценивает ссылку на функцию), а затем немедленно вызывает (или вызывает) функцию с любыми аргументами () - или без аргументов как в вашем образце.

Это более или менее эквивалентно выполнению этого:

const someFunc = (function() { ... }); //merely assigns a function, the code inside doesn't run
someFunc(); //invokes the function (but in this case it isn't immediate)

, за исключением того, что в этом случае вы привязали ссылку на функцию к переменной, и она больше не является IIFE.

0 голосов
/ 22 марта 2020

Причина чисто синтаксическая. Синтаксический анализатор JavaScript должен иметь возможность легко различать объявления функций и выражения функций. Если мы оставим скобки вокруг выражения функции и поместим наш немедленный вызов в отдельный оператор function () {} (3) , синтаксический анализатор JavaScript начнет его обрабатывать и завершит, потому что это отдельное утверждение, начинающееся с ключевого слова function, что оно имеет дело с объявлением функции.

Поскольку каждое объявление функции должно иметь имя (а здесь мы его не указали), будет выдано сообщение об ошибке. Чтобы избежать этого, мы помещаем выражение функции в круглые скобки, сообщая синтаксическому анализатору JavaScript, что он имеет дело с выражением, а не с оператором. Существует также альтернативный способ достижения той же цели:

  (function(){}(3))

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

Эти четыре выражения являются вариациями одной и той же темы немедленно вызываемых выражений функций, которые часто встречаются в различных библиотеках JavaScript:

+function(){}();
-function(){}();
!function(){}();
~function(){}();

На этот раз вместо использования скобок вокруг выражений функций, чтобы отличить их от объявления функций, мы можем использовать унарные операторы: +, -,! и ~. Мы делаем это, чтобы сообщить движку JavaScript, что он имеет дело с выражениями, а не с утверждениями.

...