请考虑以下代码:
function foo(a)
{
console.log(a+b);
}
foo(2);
将导致引用错误,因为未定义b。
现在考虑一下:
function foo(a)
{
console.log(a+b);
var b = 0;
}
foo(2);
结果是 NaN 。所以javascript知道b
存在,但它还没有值。
问题:如何从JS引擎的角度解释这个问题?简单地说,看起来JS引擎首先声明作用域中的所有变量,但只在需要时为其指定值。有人对此有更科学的文章吗?
我清楚地了解会发生什么,我只是想知道它背后的原因(为什么引擎在使用之前知道b
)
答案 0 :(得分:3)
function foo(a)
{
console.log(a+b);
var b = 0;
}
实际上看起来像是以下JavaScript:
function foo(a)
{
var b;
console.log(a+b);
b = 0;
}
这称为变量Hoisting,当您在JavaScript中声明变量时,声明将被提升到声明函数的顶部,并且赋值将在原始位置进行。