我们都知道在js中所有的代码都是按顺序执行的,那么问题来了,有时候在变量赋值前调用变量,为什么程序不是报错,而是undefined的呢?比如说下图
- 如果按照js按顺序执行的情况下,应该是报错的情况,而不是如图的情况,我们再把第三行删除,看看结果是怎样?
- 毫无疑问的,变量test报错了,但是函数没有报错。这是为什么呢?
答案是:变量提升的原因
-
那么什么是变量提升呢? 一句话总结,就是在变量赋值的时候,通过提升变量的声明到代码开头的位置,先对变量先赋值为undefined值(也可以理解为把变量先进行声明),如果是函数就是将整个函数声明进行提升到代码开头的位置。
-
把第一幅图里的代码直观的变现变量提升的情况就是下图:
-
注意es6之后就出现了let,const这两个所定义的变量是不存在变量提升的,也就是在图一里的用法是会出现报错的,也就出现了所谓的暂时性死区。简单描述原因是,let或者const所定义的变量也会变量提升,但是在赋值之前使用并不是undefined,而是出现报错,下一篇再谈谈var,const,let之间的区别。