2016-03-03 96 views
-1

你能帮我理解JS为什么这样工作吗?Javascript未定义的变量函数内部重新定义

var timer = 3; 
var func = function() { 
    alert(timer); 
    var timer = 5; 
} 
func(); 

它返回我“未定义”。

如果我做

var timer = 3; 
var func = function() { 
    alert(timer); 
    timer = 5; 
} 
func(); 

它按预期工作(警报3)。

这是与范围,我不明白正确的东西。 不应该在警报之后覆盖“timer”的定义吗?

仅在铬上进行测试。

谢谢你们。

+0

它被称为'变量提升'..只是查找相同的。 – gurvinder372

+0

吊装。无论何时定义'var xxx','var'定义都会被移动到作用域的顶部(在本例中为函数的第一行;在alert()之前)。 – h2ooooooo

回答

4
​​

这段代码在js解释时变成了这个;

var timer = 3; 
var func = function() { 
    var timer; // Here local variable timer is undefined 
    alert(timer); // here local var timer alerts rather than global var timer 
    timer = 5; // here timer got initialized 
} 

这是因为在JavaScript提升的概念。你可以阅读提升frome here

+0

虽然这是事实,但您应该给出一个或两个解释变量提升的链接,而不是“这是发生的事情”。 – h2ooooooo

+0

或者将其标记为DUPE ... – Rayon

0

变量提升是令人讨厌的javascript'提升'(发送变量声明)到当前范围的顶部。

但是,它不会将初始化发送到当前作用域的顶部。

所以:

​​

变为:

var timer = 3; 
var func = function() { 
    var timer; 
    alert(timer); 
    timer = 5; 
} 

当它被解释。

提起(对许多开发人员)JavaScript的未知或被忽视的行为。

如果开发人员不理解提示,程序可能包含错误(错误)。

为了避免错误,请始终在每个范围的开头声明所有变量。

因为这是JavaScript解释代码的方式,所以它总是一个很好的规则。