Source:.
»... Интересно, если бы вы указать имя для этой функции и поставить скобки сразу после нее, анализатор может также бросить SyntaxError, но по другой причине Хотя круглые скобки помещенный после выражения, указывает, что выражение является вызываемой функцией, парсеры, помещенные после того, как оператор полностью отделен от предыдущего состояния, и являются просто оператором группировки (используется как средство для управления приоритетом оценки)."
// While this function declaration is now syntactically valid, it's still
// a statement, and the following set of parens is invalid because the
// grouping operator needs to contain an expression.
function foo(){ /* code */ }(); // SyntaxError: Unexpected token)
// Now, if you put an expression in the parens, no exception is thrown...
// but the function isn't executed either, because this:
function foo(){ /* code */ }(1);
// Is really just equivalent to this, a function declaration followed by a
// completely unrelated expression:
function foo(){ /* code */ }
(1);
Поэтому вам нужно написать функцию, как
(function doSomething() {})();
, как это говорит анализатору, чтобы оценить его как выражение функции, в отличие от функции декларации. И все, что вы делаете, то немедленно вызывает выражение.
Функция x() {} - это то же самое, что и var x = function() {}, а явный var "возвращает" void вместо назначения. Вот почему вы не можете сказать предупреждение (var x = 1), но вы можете сказать alert (x = 1), то же самое для функций. – dandavis