Javascript:变量范围 - 澄清请求

时间:2013-06-16 18:42:41

标签: javascript node.js scope

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

假设有两个文件: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环境中执行时的输出,>>> "节点scope2.js"

  

undefined undefined 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中上述代码的输出是:

  

undefined undefined undefined 5 6

为什么会出现这种情况?

我理解JS中变量作用域的大部分基础知识,但这让我感到困惑,我不想用一些不好的假设来理解。

1 个答案:

答案 0 :(得分:3)

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

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

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
})();

那些提升的变量声明会影响函数开头的外部变量 ,即使它们仅在第一个console.log之后得到一个值。

在第一个代码中,区别在于woo未在内部作用域中声明,因此您正在记录外部值。