Почему данный код приводит к возникновению ошибки?
var a = 5
(function() {
// ...
})();
Если не ставить ; там, где это требуется, то в некоторых ситуациях точки с запятой будут подставлены автоматически. Однако есть ситуации, в которых ; подставлена не будет, и в итоге код будет обработан совсем не так, как планировалось.
В спецификации в разделе 7.9.2 есть пример, в котором ; не будет подставлена, и который похож на пример из вопроса:
a = b + c
(d + e).print()
is not transformed by automatic semicolon insertion, because the parenthesised expression that begins the second line can be interpreted as an argument list for a function call:
a = b + c(d + e).print()
В примере из вопроса суть сводится к тому, что конструкция 5(function() {...}) воспринимается как вызов функции 5 и передача ей в качестве аргумента функции. () же в конце воспринимается как вызов результата выполнения 5 как функции
Пример того как это выполняется (5 заменено на f, потому что не очень-то получится объявить функцию с именем в виде числа):
function f(func) {
func();
return function(number) {
console.log(number);
};
}
var a = f
(function() {
console.log("func");
})(10);
Сборка персонального компьютера от Artline: умный выбор для современных пользователей