Это одна из причин, по которой не стоит полагаться на автоматическую вставку точек с запятой (ASI), если только вы и каждый программист, которые могли бы работать над кодом, очень четко придерживаются правил для ASI.
Ваш код пытается вызвать 2
как функцию, передавая результат вызова функции bar в качестве аргумента, потому что ()
вокруг следующего IIFE может быть разумно (по правилам ASI) считаться частью let b =
заявление.Поскольку вызов bar
происходит до объявления b
(он не объявляется до тех пор, пока не будет запущен инициализатор), вы получите сообщение об ошибке.
Если мы немного изменим разрывы строк, вы увидите, что происходит:
function foo(){
var a = 1
let b = 2(function bar() {
console.log(a)
console.log(b)
}());
}
console.log(foo());
Добавление ;
исправляет это:
function foo(){
var a = 1;
let b = 2;
(function bar() {
console.log(a);
console.log(b);
}());
}
console.log(foo());