Подтвердить что ты не робот

Почему a undefined, а b равно 3 в var a = b = 3?

В следующем коде я ожидал, что a и b будут 3. Однако a - undefined, а b - 3. Почему?

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

console.log(typeof a);//"undefined"
console.log(b);//3
4b9b3361

Ответ 1

Проблема заключается в том, что большинство разработчиков понимают утверждение var a = b = 3; для сокращения:

var b = 3;
var a = b;

Но на самом деле var a = b = 3; на самом деле сокращенно:

b = 3;
var a = b;

Следовательно, b становится глобальной переменной (поскольку ей не предшествует ключевое слово var) и все еще находится в сфере видимости даже вне встроенной функции.

Причина a undefined заключается в том, что a является локальной переменной для этой самоисполняющейся анонимной функции

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

Ответ 2

var a=b=3 

То же, что и:

var a = (b = 3) 

А оператор var применяется только к a, а не к b. Вы можете проверить синтаксис оператора var здесь.

Поэтому a будет определяться в локальной области, а b будет определяться в глобальной области. Внутренняя функция a и b равна 3, но после возвращения функции зарегистрированная локальная переменная (a) удаляется. Поскольку b определяется в глобальной области видимости, он не удаляется.

Ответ 3

a Действительно, действительно 3, но он находится в рамках анонимной функции.

эта строка var a = b = 3 на самом деле:

  • b = 3, тогда как b объявляется как глобальная переменная.

  • Возвращаемое значение присваивания express b=3 - это да, назначенное значение 3.

  • var a = the return value of previous expression, таким образом, равен var a = 3, но на этот раз a - локальная переменная.

За пределами анонимной функции b доступен, но a даже не существует, из-за того, что он не определен в глобальной области.

Ответ 4

Я написал в следующем стиле:

console.log(typeof b);//"number"
console.log(a);// error with a is not defined

Таким образом, в случае вашего a не распознается, поскольку он не находится в глобальной области. НО b рассматривается как глобальный. var используется для объявления локальной переменной.

Ответ 5

Сравните приведенный ниже код

'use strict'
(function(){
    var a = b = 3; // ERROR. Prevents global variable name clash
})();

И

(function(){
    var a = b = 3; // Silently assigns 3 to a global variable b
})();

console.log(typeof a);//"undefined"
console.log(b);// 3