JavaScript:在函数中初始化变量

Dan*_*iel 4 javascript

这里有点基本的问题.我可以看到发生了什么,但我不能真正理解为什么它会以这种方式工作.

a = false;
var k = function() {
    console.log(a);
    var a = true
    console.log(a);
}();
Run Code Online (Sandbox Code Playgroud)

我希望日志读取"false,then true",但"a"一开始就是未定义的.有人可以详细说明为什么会这样做.

PS.我不是在寻找答案,告诉我应该做些什么,我正在寻找这个JavaScript内部工作原理的解释.

提前致谢

lon*_*day 10

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

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

a = false;
var k = (function() {
    var a;
    console.log(a);
    a = true
    console.log(a);
}());
Run Code Online (Sandbox Code Playgroud)

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

显然,这现在设置aundefined它的第一个前console.log.


正如MDC文档所说:

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