2013-07-08 46 views
12

上执行分配变量名相同的变量名

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

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

如何能在第一个代码只执行仿佛a已经被初始化之前。

+5

第一条语句是像'VAR一个=未定义; window.b = window.c = window.d = window.e = window.f = a;'第二个'y没有定义' – rab

+1

@rab只是发布那个答案。这是正确的 – rossipedia

回答

11

这是因为可变悬挂。 var x = EXPR;实际上是转换成这样:

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

对于你的榜样,这意味着:只有a使用var声明

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

注 - 让你创建吨全局的是总是一件坏事

+0

所以,如果删除了''在表达式的末尾,这将导致一个错误,但如果不是,它会创建全局和分配的'了'价值,所有的变量? – Givi

+1

是的,这是正确的。如果删除最后一个'a',则不存在的'f'将被读取并导致异常,因为它不存在。 – ThiefMaster

5

你的第一条语句就像

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

其中定义,和其他人是全球范围的。假设你执行一个函数。

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

b可以在外面访问。

在第二var x=yy还没有定义

+1

小幅调整:访问全球'x'不太一样访问'window.x':'window.x'永远不会失败,但如果''x'完全不存在x'失败。 – ThiefMaster