Простая причина, по которой он не работает, не в том, что ;
указывает на конец анонимной функции. Это потому, что без ()
в конце вызова функции, это не вызов функции. То есть
function help() {return true;}
Если вы позвоните result = help();
, это вызов функции, который вернет true.
Если вы звоните result = help;
, это не звонок. Это задание, в котором помощь рассматривается как данные, которые должны быть присвоены результату.
То, что вы сделали, объявили / создали экземпляр анонимной функции, добавив точку с запятой,
(function (msg) { /* Code here */ });
, а затем попытался вызвать его в другом выражении, используя только круглые скобки ... Очевидно, потому что у функции нет имени, но это не будет работать:
('SO');
Интерпретатор видит круглые скобки во второй строке как новую инструкцию / оператор, и поэтому он не работает, даже если вы сделали это так:
(function (msg){/*code here*/});('SO');
Это все еще не работает, но работает, когда вы удаляете точку с запятой, потому что интерпретатор игнорирует пробелы и каретки и видит полный код как одно утверждение.
(function (msg){/*code here*/}) // This space is ignored by the interpreter
('SO');
Вывод: вызов функции не является вызовом функции без ()
в конце, если только при определенных условиях, например, при вызове другой функции, то есть onload = 'help' будет выполнять функцию справки, даже если в скобках не были включены. Я полагаю, что setTimeout и setInterval также позволяют этот тип вызова функции, и я также полагаю, что интерпретатор в любом случае добавляет скобки за кулисы, что возвращает нас к «вызову функции не вызов функции без скобок».