4

我从朋友那里看到了这段代码,我想知道为什么会这样。

假设有两个文件:scope2.js 和 scope3.js

scope2.js

console.log(foo);
var foo=6;
woo=5;
(function()
{
    console.log(foo);
    console.log(woo);
    var foo=5;

console.log(foo);
console.log(woo);
})();

在 NodeJS 环境中执行时的输出,>>> "node scope2.js"

未定义 未定义 5 5 5

现在,Scope3.js

console.log(foo);
var foo=6;
woo=5;
(function()
{
    console.log(foo);
    console.log(woo);
    var foo=5;
    var woo=6;
    console.log(foo);
    console.log(woo);
})();

以上代码在 nodejs env 中的输出是:

未定义 未定义 未定义 5 6

为什么会有这种行为?

我了解 JS 中变量作用域的大部分基础知识,但这让我感到困惑,我不想理解一些带有错误假设的东西。

4

1 回答 1

3

您错过的事实是变量声明被“提升”到其范围的开头(即声明它们的函数或全局范围)。

所以你的第二个代码相当于

var foo;
console.log(foo); // undefined value
foo=6;
woo=5;
(function()
{
    var foo, woo; // shadow the external variables
    console.log(foo); // undefined value
    console.log(woo); // undefined value
    foo=5;
    woo=6;
    console.log(foo); // 5
    console.log(woo); // 6
})();

那些提升的变量声明从函数开始就隐藏了外部变量,即使它们仅在两个 first 之后才获得值console.log

在第一个代码中,不同之处在于woo未在内部范围中声明,因此您正在记录外部值。

于 2013-06-16T18:45:06.543 回答