var a = 1
var a
console.log(a)
上面这段代码输入1,为什么第二次声明没有覆盖第一次声明呢?
var a = 1
var a = 2
console.log(a)
上面这段代码输出2,这里为什么第二次声明又覆盖了第一次声明呢?
这要从js代码运行机制说起:
在JS代码运行过程中:
引擎负责整个代码的编译和执行,编译器负责语法分析、词法分析、代码生成等,而作用域则负责维护所有的标识符(变量)
当执行上面的代码时,可以简单的理解为给新变量分配一块内存,命名为a,并赋值为1;但在运行的时候编译器与引擎还会进行两项额外的操作,即判断变量是否已经声明:
1.首先编译器对代码拆解,从左往右遇到了var a, 然后去询问作用域是否存在这个变量,如果不存在就让作用域声明一个新的变量a,如果存在就忽略var继续往下编译,这时a=1被编译成可执行的代码供引擎使用
2.引擎遇见a=1时也会去询问作用域是否存在这个变量,若存在,则赋值为1,若不存在,就沿着作用域往上查找,若找到了,赋值为1,若没找到,让作用域声明一个新的变量a
用代码解释上述执行过程就是:
var a
a = 1
// var a 忽略
console.log(a)
var a
a = 1
// var a 忽略
a = 2
console.log(a)