Причина чисто синтаксическая. Синтаксический анализатор JavaScript должен иметь возможность легко различать объявления функций и выражения функций. Если мы оставим скобки вокруг выражения функции и поместим наш немедленный вызов в отдельный оператор function () {} (3) , синтаксический анализатор JavaScript начнет его обрабатывать и завершит, потому что это отдельное утверждение, начинающееся с ключевого слова function, что оно имеет дело с объявлением функции.
Поскольку каждое объявление функции должно иметь имя (а здесь мы его не указали), будет выдано сообщение об ошибке. Чтобы избежать этого, мы помещаем выражение функции в круглые скобки, сообщая синтаксическому анализатору JavaScript, что он имеет дело с выражением, а не с оператором. Существует также альтернативный способ достижения той же цели:
(function(){}(3))
Обернув непосредственное определение функции и вызов в скобках, вы также можете уведомить синтаксический анализатор JavaScript, что он имеет дело с выражением.
Эти четыре выражения являются вариациями одной и той же темы немедленно вызываемых выражений функций, которые часто встречаются в различных библиотеках JavaScript:
+function(){}();
-function(){}();
!function(){}();
~function(){}();
На этот раз вместо использования скобок вокруг выражений функций, чтобы отличить их от объявления функций, мы можем использовать унарные операторы: +, -,! и ~. Мы делаем это, чтобы сообщить движку JavaScript, что он имеет дело с выражениями, а не с утверждениями.