这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战。
变量提升是什么
变量提升时js里一个很特殊的概念,这和js代码的编译和执行,作用域息息相关。
写js的时候,你有没有发现,变量声明就算是写在代码最后面,它依然可以被前面的函数调用,不会报错?
明明是在代码后面声明的变量,却在代码执行时,被提前声明了,这就是js里面的变量提升。
为什么会变量提升
要了解为什么会变量提升,首先我们要看声明语句时怎么在js里执行的。
var a = 2 的执行过程
我们都知道,编译器编译的代码,会交给js引擎执行。
事实上,在这个步骤中,有一个东西,叫做作用域,专门管理变量的声明。
var a = 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