关于JS中的变量提升
var的变量提升的原理
原理:JS引擎的工作方式是①先解析代码,获取所有被声明的变量;②然后在运行。也就是专业来说是分为预处理和执行两个阶段。
变量提升的定义:所有变量的声明语句都会被提升到代码头部,这就是变量提升。
例如:
console.log(a);
var a =1;
以上语句并不会报错,只是提示undefined
。实际在js引擎中的运行过程是:
var a;
console.log(a);
a =1;
这是为什么呢,让我先说明以下几点
- 一段JavaScript代码,是先由编译器编译成可执行代码,再交给引擎去执行的。
- 用
var
关键字声明的变量是在编译阶段声明的。
每当编译器遇到var xxx
,都会去查找当前作用域是否已存在变量xxx
,如果xxx
已存在,则忽略该声明,反之,在当前作用域声明变量xxx
。
所以当成程序执行下面代码时
console.log(a);
var a = 2;
- 首先编译器查找当前作用域是否存在变量
a
,发现a
并不存在,声明变量a
。 - 再由引擎执行由编译器生成的代码
console.log(a)
,此时变量a
已经被编译器声明,但是还未被赋值,所以此时控制台输出的值是undefined
。 a = 2
,此时变量a的值为2。
其实关键点就在于,由var
关键字声明的变量是在编译阶段
声明的,所以会出现变量提升的情况。
但是编译器对ES6语法中的const
和let
关键字声明的变量则不会提前声明,所以不会出现变量提升。