переменная, определенная с помощью let, не определена в той же области IIFE - PullRequest
0 голосов
/ 28 мая 2018

У меня есть код ниже.Я надеюсь, что он может правильно регистрировать a и b, но в результате он регистрирует a как 1, b не определен с ошибкой:

Uncaught ReferenceError: b isне определено

function foo(){
    var a = 1
    let b = 2
    (function bar() {
        console.log(a)
        console.log(b)
    }())
}
console.log(foo());

Если я изменю код, чтобы сделать bar в качестве объявления функции, все будет хорошо

function foo(){
    var a = 1
    let b = 2
    function bar() {
        console.log(a)
        console.log(b)
    }
    bar()
}
console.log(foo());

Я знаю кое-что о области действия функции, области блока, подъеме.Но я действительно не понимаю, что делает b «не определенным»

Весь приведенный выше код был запущен в devTools Chrome 66

1 Ответ

0 голосов
/ 28 мая 2018

Это одна из причин, по которой не стоит полагаться на автоматическую вставку точек с запятой (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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...