变量的重复声明赋值

var a = 1;
var a = 2;
a = 3;
console.log(a); //3

在JS代码运行过程中:
引擎负责整个代码的编译以及运行,编译器则负责词法分析语法分析代码生成等工作而作用域则如我们熟知的一样,负责维护所有的标识符(变量)。
当我们执行上面的代码时,我们可以简单的理解为新变量分配一块儿内存,命名为a,并赋值为1,但在运行的时候编译器与引擎还会进行两项额外的操作:判断变量是否已经声明:

  1. 首先编译器对代码进行分析拆解,从左至右遇见var a,则编译器会询问作用域是否已经存在叫a的变量了,如果不存在,则招呼作用域声明一个新的变量a,若已经存在,则忽略var继续向下编译,这时a = 2被编译成可执行的代码供引擎使用。
  2. 引擎遇见a=3时同样会询问在当前的作用域下是否有变量a,若存在,则将a赋值为3(由于第一步编译器忽略了重复声明的var,且作用域中已经有a,所以重复声明会发生值得覆盖而并不会报错)。若不存在,则顺着作用域链向上查找,若最终找到了变量a则将其赋值2,若没有找到,则招呼作用域声明一个全局变量a并赋值为3(,当然,在严格模式下JS会直接抛出异常:a is not defined)

变量与函数重名的时候,变量生效

var a = 1;
function a() {
    return 'method:a';
}
console.log(a);//1


这涉及到了变量和函数的预解析:

  • 变量声明会被顶置,函数声明也会被顶置且比变量更先声明。
  • 变量的声明和赋值语句一起写时,JS引擎在解析时,会将其拆成声明和赋值2部分,声明置顶,赋值保留在原来位置。
  • 声明过的变量不会再重复声明。
Last modification:April 17th, 2020 at 04:36 pm
如果觉得我的文章对你有用,请随意赞赏