Связанные с Javascript назначения переменных, объявленные внутри IIFE, получают глобальную видимость? - PullRequest
0 голосов
/ 05 июня 2018

Недавно меня спросили, к чему приведет следующий код JavaScript, и правильный ответ смущает меня:

(function () {
    var a = b = 5;
})();
console.log(b);

Я бы подумал, что это напечатало бы undefined, но на самом деле печатает 5.

Насколько я понимаю, все переменные, определенные внутри IIFE (выражение немедленно вызванной функции), должны не быть видимыми за пределами его области видимости.Как именно порядок этих объявлений переменных делает b видимым за пределами его области действия, в то время как a не виден за пределами его области видимости?

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Ваш код равен этому

(function () {
    b = 5;
    var a = b;
})();
console.log(b);

Если вы объявите переменную без var, let or const, она будет глобальной и будет присвоена объекту window (в JS браузера), поэтомудоступны везде.

0 голосов
/ 05 июня 2018

Синтаксис для объявления нескольких var с одним оператором:

var a, b;
// or:
var a = 5, b = 5;

У вас есть объявление var a, но b является частью выражения значения и не являетсязависит от var, поэтому просачивается в глобальную область.

0 голосов
/ 05 июня 2018

Это:

var a = b = 5;

Эквивалентно:

b = 5;
var a = b;

, а не

var b = 5;
var a = b;

Создает b какглобальный, а затем присваивает значение b a.

Это также запрещено в строгом режиме.Всегда используйте строгий режим!

"use strict";

(function () {
    var a = b = 5;
})();
console.log(b);
...