js变量提升的原理
👉👉本文共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