js变量提升的原理

Author Avatar
zzz1220 7月 09, 2018
  • 在其它设备中阅读本文章
👉👉本文共415字📘 读完共需1分钟⌚

新版的es6里面,加入了块级作用域let,算是解决了长久以来javascript的变量提升问题。没有let之前,变量只有函数内的作用域和全局作用域(其实全局也是在window这个对象下的),一方面如果忘记加上var,作用域就会提升,另一方面,对变量提升一知半解,导致变量先计算,再赋值,会造成难以预料的问题。

JS引擎的方式

因为javaScript是脚本语言,运行在JS虚拟机里面,因此,非常有必要了解一下JS引擎执行JS代码的过程。
JS引擎的工作方式就是:1,解析(编译)JS代码,这时候会声明所有的变量,注意这里没有对变量赋值;2,运行,运行的时候会对变量进行赋值。同一个作用域内,变量的声明语句都会被提升到代码的头部,这个就是变量提升,比如:

console.log(a);
var a = 10;

运行结果是:

undefined;

因为变量提升后是这样的:

var a ;
console.log(a);
a = 10;

实际上运行的时候,a还没有被赋值。

需要注意的地方

1.变量提升只对var命令声明的变量有效,如果一个变量不是用var命令声明的,就不会发生变量提升。

console.log(aa);
aa =1;  // 会报错

2.function也可以看为变量,会发生提升。但是如果是赋值的形式,则不会

function a(){}; // 会提升
var b = function(){}; // 不会提升,因为这个是赋值语句,运行时,b没有被赋值,因此是undefined