JavaScript 解释器是否将所有变量设置为未定义

Do JavaScript interpreters set all variables to undefined

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

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

编辑

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

给定这一行 JavaScript 文件

var three  = 3;

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

var three;
three = 3;

w3schools 有一篇很好的文章对此进行了一些详细的解释。

Javascript解释器hoist代码执行前的变量,所以写成:

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

实际上等同于:

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

我相信这是分几个阶段完成的,因为 JavaScript 在执行之前进行了优化,为此引擎必须对代码有一定的了解。这是引擎如何处理 JavaScript 的图片,专门用于从 http://blog.chromium.org/2015/03/new-javascript-techniques-for-rapid.html:

获取的铬

由此可以看出,代码既被解析(以检查有效性),也可能创建词法标记,然后在运行时执行之前对其进行编译和优化。正是在这个编译阶段,变量将被声明(产生提升的影响),但在执行期间将被初始化。

我一直在观看 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);.

之前定义,这与您预期的错误类型相同

所有 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 代码将抛出错误。