JavaScript:在函数中初始化变量

时间:2011-02-09 09:31:19

标签: javascript

这里有一个基本的问题。我可以看到发生了什么,但我无法理解为什么它会以这种方式运作。

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

我希望日志读取“false,then true”,但“a”首先是未定义的。有人可以详细说明为什么会这样做。

聚苯乙烯。我不是在寻找一个答案告诉我应该做什么,我正在寻找这个JavaScript内部工作原理的解释。

提前致谢

1 个答案:

答案 0 :(得分:10)

这是因为Javascript作用域的工作称为“提升”。当解析器读取Javascript函数时,它会遍历并查找该作用域中定义的所有变量(使用var)关键字(请记住,Javascript中唯一的作用域类型是函数作用域)。然后它将它们放在函数的顶部。

因此解析器按如下方式解释您的代码:

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

(注意我已更正了您的函数调用,因此它不会返回语法错误。)

显然,现在将a设置为undefined,然后才能执行第一个console.log


As the MDC docs say

  

变量的每个定义实际上都是其范围顶部变量的声明,以及定义所在位置的赋值。