Присвоение имени переменной тому же имени переменной

При выполнении

var a=b=c=d=e=f=a; 
//no error(a has not initialize before)

var x=y;
//ReferenceError: y is not defined

Как первый код может выполняться, как если бы a уже был инициализирован раньше.

Ответ 1

Это из-за переменного подъема. var x = EXPR; фактически преобразуется в это:

// beginning of the block (function/file)
var x; // === undefined
// ...
// the actual position of the statement
x = EXPR

В вашем примере это означает:

var a;  // === undefined
a = b = c = d = e = f = a;

Обратите внимание, что только a объявляется с помощью var - поэтому вы создаете тонны глобальных переменных, которые всегда плохие вещи!

Ответ 2

Ваше первое утверждение похоже на

var a = undefined; 
a = window.b = window.c = window.d  = window.e = window.f = a; 

где a определено, а другие являются глобальными. предположим, что вы выполняете функцию.

(function(){
  var a=b=c=d=e=f=a; 
  b = 10;
}());

b можно получить доступ снаружи.

во второй var x=y, y еще не определен