我从朋友那里得到了这段代码,我想知道为什么这样做会这样。
假设有两个文件: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中变量作用域的大部分基础知识,但这让我感到困惑,我不想用一些不好的假设来理解。
答案 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
未在内部作用域中声明,因此您正在记录外部值。