为什么var可以重复声明

Posted yanze

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么var可以重复声明相关的知识,希望对你有一定的参考价值。

总结自:https://blog.csdn.net/DurianPudding/article/details/87953939

一言以蔽之:编辑器会在作用域判断这是重名声明时,忽略var直接赋值

首先说明JS代码运行时三者的作用:

引擎负责整个代码的编译以及运行

编译器则负责词法分析、语法分析、代码生成等工作

作用域负责维护所有的标识符(变量)。

 

例:

var a = 2;
var a = 3;
a = 4;
alert(a); // 4

重复声明时:首先,编译器对代码进行分析拆解,当遇见var a,则询问作用域是否已存在叫a的变量,若不存在,则要求作用域声明一个新的变量a,若已存在,则忽略var继续向下编译

赋值时:引擎遇见a=2时同样会询问在当前的作用域下是否有变量a。若存在,则将a赋值为2;若不存在,则顺着作用域链向上查找,若最终找到了变量a则将其赋值2,若没有找到,则招呼作用域声明一个变量a并赋值为2(这就是为什么第二段代码可以正确执行且a变量为全局变量的原因,当然,在严格模式下JS会直接抛出异常:a is not defined)。

以上是关于为什么var可以重复声明的主要内容,如果未能解决你的问题,请参考以下文章

在变量声明中使用 var 有啥好处? [复制]

ES6语法和应用

const vs var 和 window.name 属性[重复]

ES6语法:let和const

var,let和const的区别是什么?

js中var的重复声明