переменные из IIFE доступны в глобальной области видимости

почему выход этого IIFE равен 5?

(function() {
  var a = b = 5;
})();

console.log(b);

Я попробовал console.log(a), но он выдает ошибку ссылки, как и ожидалось, почему «b» жив в глобальной области видимости?


person Maaz Ahmad Khan    schedule 27.08.2020    source источник
comment
Попробуйте отдельные присваивания и объявления переменных. Это не должно работать в строгом режиме.   -  person zero298    schedule 27.08.2020
comment
Я хочу понять, почему это работает?   -  person Maaz Ahmad Khan    schedule 27.08.2020
comment
Я могу быть совершенно неправ, но это как-то связано с подъемом?   -  person Maaz Ahmad Khan    schedule 27.08.2020
comment
К подъему отношения не имеет   -  person Quentin    schedule 27.08.2020
comment
вы не находитесь в строгом режиме, b не объявлен в области видимости, поэтому он создается для глобального объекта (глобального или оконного). в строгом режиме вы получите ошибку при назначении b. это хороший вопрос, и я уверен, что он дублируется. ????   -  person Tobias Nickel    schedule 27.08.2020


Ответы (4)


Интересный вопрос. Хотя это вообще не связано с 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;), он попадает в глобальную область. В строгом режиме это не сработает.

person Patrick Hollweck    schedule 27.08.2020

Это происходит просто потому, что вы объявляете b глобальной переменной, а не локальной.

(function() {
  var a = b = 5;
})();

Может выглядеть так, как будто он определяется локально из-за var, но это относится только к a.

person Mitya    schedule 27.08.2020

Это происходит из-за утечки, что означает непреднамеренное создание локально объявленных переменных, доступных для глобальной области видимости. Дополнительную информацию можно найти здесь. Давайте разделим ваш код:

var a = b = 5;

Это означает: a принимает значение b, равное 5. Переменная b в этом случае неявно объявляется и инициализируется (с b = 5), и, поскольку вы не указываете область ее блока (это потому, что var относится к a, а не b) он ограничен глобальной областью.

person federico-dondi    schedule 27.08.2020

Из документации.

Областью действия переменной, объявленной с помощью var, является ее текущий контекст выполнения и его замыкания, которые являются либо охватывающей функцией, либо функциями, объявленными в ней.

person matek997    schedule 27.08.2020