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
代码将抛出错误。
当创建诸如 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
代码将抛出错误。