与JavaScript范围混淆

Har*_*hid 16 javascript scope

我对JavaScript范围有一些了解 - 该语言具有函数级范围,并且变量和函数声明被提升到其包含范围的顶部.但是,我无法弄清楚为什么以下两段代码记录不同的值:

这会将值1记录到控制台:

var a = 1;
function b() {
    a = 10;
    return;
    function a() {}
}
b();
console.log(a);
Run Code Online (Sandbox Code Playgroud)

神秘的是,这记录10:

var a = 1;
function b() {
    a = 10;
    return;        
}
b();
console.log(a);
Run Code Online (Sandbox Code Playgroud)

那么引擎盖下面发生了什么?

Thi*_*ilo 14

我发现第一个例子更神秘......

在第二个示例中,您不在a函数内部声明变量.因此,当您指定时a,它会a以外部为目标.非常直截了当.

在第一个示例中,您a在函数内部声明了一个变量,但是以一种不寻常的方式:通过声明一个名为的函数a.因此,分配a将使用该本地"变量".

这里要带走两件事:

a)变量和函数声明被"提升"到其范围的顶部.虽然function a(){}写在最后,a但是已经创建了保持它的变量并且在范围的顶部可见.

b)函数也可以用作变量.您可以传递函数,可以重新分配函数定义.它们与其他变量共享相同的命名空间.