2011-02-09 97 views
4

这里有一个基本的问题。我可以看到发生了什么,但我无法真正理解为什么它会以这种方式工作。JavaScript:初始化函数中的变量

a = false; 
var k = function() { 
    console.log(a); 
    var a = true 
    console.log(a); 
}(); 

我希望日志以阅读“假的,那么真正的”,而是“一个”未定义在第一。有人可以详细说明它为什么这样做。

Ps。我不是在寻找答案,告诉我该怎么做,我正在寻找关于这段JavaScript内部工作原理的解释。

在此先感谢

回答

10

这是因为使用Javascript作用域的工作方式是所谓的“吊装”。当解析器读取一个Javascript函数时,它会经过并找到在该范围内定义的所有变量(使用var)关键字(请记住,JavaScript中唯一的范围类型是函数作用域)。然后它将它们放在函数的顶部。

所以解析器解释你的代码如下:

a = false; 
var k = (function() { 
    var a; 
    console.log(a); 
    a = true 
    console.log(a); 
}()); 

(注:我已经纠正你的函数调用,以便它不会返回一个语法错误。)

这显然现在设置aundefined,然后再执行第一个console.log


As the MDC docs say

变量的每一个定义是真的在其范围顶端的变量声明,并在这里的定义是地方的分配。

+0

Aaah ..抬头......我真的在想它,但是你打败了我这个答案...... + 1 – 2011-02-09 09:43:56