JavaScript解释器将所有变量设置为undefined

时间:2015-06-07 21:53:33

标签: javascript interpreter

创建var three = 3;之类的变量时,JavaScript解释程序首先分配var three;然后three = 3;还是一次性完成?

我在这里感兴趣的部分是潜在的中间undefined值和一种方法,如果可能的话,可以观察这个过程。

修改

新标题:变量初始化之前是否发生变量声明

鉴于这一行JavaScript文件

var three  = 3;

解释器是否仍然提升变量3并有效地将其更改为

var three;
three = 3;

w3schools有一篇很好的文章详细解释了这一点。

3 个答案:

答案 0 :(得分:4)

Javascript在代码执行之前解释变量hoist,所以写:

console.log(three);
var three = 3;

实际上与:

相同
var three;
console.log(three);
three = 3;

答案 1 :(得分:2)

我相信它是在几个阶段完成的,因为JavaScript在执行之前已经过优化,为此,引擎必须对代码有一些了解。以下是引擎如何处理专门针对来自http://blog.chromium.org/2015/03/new-javascript-techniques-for-rapid.html的铬的JavaScript的图片:

enter image description here

您可以看到代码被解析(以检查有效性)并可能创建词法标记,然后在运行时执行之前进行编译和优化。在这个编译阶段,变量将在执行期间被声明(给出提升的影响),并且它们将被初始化。

我一直在观看Kyle Simpson教授的Advanced JavaScript课程,该课程对此进行了大量讨论,并讨论了编译JavaScript和处理变量提升的两阶段方法。以下是不使用eval使其更简单的课程的修改示例:



console.log(a);

var a = 2;
console.log(a);

console.log(c);




你可以在这里看到的是a在声明之前成功记录为未定义的 - 在它们被声明之前。这是由于其他答案中提到的变量提升,解析引擎的输出更像是:

var a;
console.log(a);

a = 2;
console.log(a);

由于编译器在执行时间之前定义了a,我们能够记录他们的undefined值,如果他们只是简单的话就不能做同时定义和初始化。

这不适用于c,但因为它没有定义,您将获得ReferenceError。突出显示这一点的原因是,如果a未被提升到顶部并在初始console.log(a);之前定义,则会出现同样的错误。

enter image description here

答案 2 :(得分:2)

所有JavaScript变量都被提升,正如@fardjad所提到的那样。它们最初也设置为undefined

要显示此信息,请考虑以下事项:

var a= eval('thr'+'ee');
var three= 3;

console.log(a);      //undefined
console.log(three);  //3

这相当于:

var a;
var three;

a= eval('thr'+'ee');
three= 3;

console.log(a);      //undefined
console.log(three);  //3

根据我的知识,没有JavaScript解释器会足够聪明地意识到在声明和初始化之前不需要three变量。如果悬挂,则eval代码会抛出错误。