【javaScript】 3分钟弄懂变量提升

这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战

变量提升是什么

变量提升时js里一个很特殊的概念,这和js代码的编译和执行,作用域息息相关。
写js的时候,你有没有发现,变量声明就算是写在代码最后面,它依然可以被前面的函数调用,不会报错?
明明是在代码后面声明的变量,却在代码执行时,被提前声明了,这就是js里面的变量提升

为什么会变量提升

要了解为什么会变量提升,首先我们要看声明语句时怎么在js里执行的。

var a = 2 的执行过程

我们都知道,编译器编译的代码,会交给js引擎执行。
事实上,在这个步骤中,有一个东西,叫做作用域,专门管理变量的声明

var a = 2
复制代码

如上代码,编译器的处理分为两步:

  1. 编译器会询问作用域是否有处于同一个作用域的变量,没有则创建变量
  2. 编译器生成a = 2 这个赋值代码,交给引擎执行

引擎作用域,找到了a这个变量,赋值为2

变量声明在代码执行之前

我们简化一下上述过程:
1.编译器编译,找到声明语句
2.作用域声明变量
3.js引擎执行代码,对已声明的变量进行赋值或取值

简单的来说,变量声明的完成,在代码执行之前。
代码执行的时候,所有变量,其实已经在相应的作用域声明好了

对象的声明和调用

我这里用函数举例。函数也是对象的一种。
函数很容易被认为,是先在作用域声明一个变量,然后js引擎执行时,将函数的执行过程赋值给该变量。

function foo(a) { console.log( a ); 

}
foo( 2 );
复制代码

作用域:声明foo这个函数的同时,foo的执行过程:console.log(a)同时会声明给foo。
js引擎:调用作用域里的foo。

参考

《你不知道的JavaScript》

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享