javascript引擎:变量存在

时间:2013-11-28 10:40:21

标签: javascript scope

请考虑以下代码:

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

1 个答案:

答案 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中声明变量时,声明将被提升到声明函数的顶部,并且赋值将在原始位置进行。