почему выход этого IIFE равен 5?
(function() {
var a = b = 5;
})();
console.log(b);
Я попробовал console.log(a), но он выдает ошибку ссылки, как и ожидалось, почему «b» жив в глобальной области видимости?
почему выход этого IIFE равен 5?
(function() {
var a = b = 5;
})();
console.log(b);
Я попробовал console.log(a), но он выдает ошибку ссылки, как и ожидалось, почему «b» жив в глобальной области видимости?
Интересный вопрос. Хотя это вообще не связано с IIFE или подъемом. Обратите внимание, что a не определено!
Ваш пример кода
function test() {
var a = b = 5;
}
семантически эквивалентен этому:
function test() {
var a = 5;
// this is essentially the same as `window.b = a`
b = a;
}
поскольку вы не объявили (он же var a;
), он попадает в глобальную область. В строгом режиме это не сработает.
Это происходит просто потому, что вы объявляете b
глобальной переменной, а не локальной.
(function() {
var a = b = 5;
})();
Может выглядеть так, как будто он определяется локально из-за var
, но это относится только к a
.
Это происходит из-за утечки, что означает непреднамеренное создание локально объявленных переменных, доступных для глобальной области видимости. Дополнительную информацию можно найти здесь. Давайте разделим ваш код:
var a = b = 5;
Это означает: a
принимает значение b
, равное 5. Переменная b
в этом случае неявно объявляется и инициализируется (с b = 5
), и, поскольку вы не указываете область ее блока (это потому, что var
относится к a
, а не b
) он ограничен глобальной областью.
Из документации.
Областью действия переменной, объявленной с помощью var, является ее текущий контекст выполнения и его замыкания, которые являются либо охватывающей функцией, либо функциями, объявленными в ней.