JavaScript:在函数中初始化变量

4

这里有一个相对基础的问题。我可以看到发生了什么,但我真的不理解为什么会以这种方式工作。

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

我希望日志记录的是“false,然后是true”,但“a”一开始是未定义的。有人能详细解释一下为什么会这样吗?
附:我不想听到应该怎么做的答案,我只需要JavaScript的内部工作原理解释。
提前感谢。
1个回答

11

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

因此,解析器将您的代码解释为以下内容:

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

(注:我已经更正了你的函数调用,以免出现语法错误。)

显然,在进行第一个console.log之前,此时将a设置为undefined


正如 MDC 文档所述:

每个变量的定义实际上都是在其作用域顶部声明该变量并在定义位置进行赋值。


啊啊啊.. 提升... 我其实正在考虑这个问题,但你比我更快地回答了它... +1 - Sachin Shanbhag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接