什么是作用域?
简单说就是在代码中定义的变量或者函数能起作用的范围
什么是作用域链?
简单说就是JavaScript 在执行时查找变量的过程,它按照从当前作用域到全局作用域的顺序逐层向上搜索,直到找到变量或到达作用域的顶端。
详细说明:
首先说明一下函数本身就是一个对象,函数定义的时候它有一些自带的属性,比如 arguments、caller、length、name、prototype、proto、[[FunctionLocation]]、[[scope]]。其中scope是一个隐式属性,里面存的是执行期上下文的集合【其实这个集合成链式结构,就是作用域链】。那什么是执行期上下文呢?执行期上下文就是当函数执行时,会创建一个执行期上下文的内部对象。而且执行期上下文是独一无二的,每次调用函数都会创建一个新的执行期上下文。函数执行完成之后,他所产生的执行期上下文被销毁。
举例说明:
function a(){
function b(){
var bb = 123
}
var aa = 234
b()
}
var glob = 100
a()
当a被定义的时候,a会发生下面这种情况。a的[[scope]]属性中存储了全局执行期上下文
当a被调用之后,a会创建一个属于自己的执行期上下文。当访问一个变量的时候,会沿着作用域链从顶端往下查找,比如在a函数中访问glob变量,就会现在a的AO对象中查找,如果没有就继续向下查找GO对象。
当b函数被定义的时候,b在a函数中定义,他会直接使用a的作用域
当b被执行的时候,会创建他自己的执行上下文。
其中b的作用域集合1位置存储的AO对象就是a的AO对象,他们俩是同一个对象。这就跟我们函数里面嵌套函数,内层函数可以访问外层函数里的变量。其中他们访问的这个变量是同一个。
关于结束:
b执行完之后会销毁其自己的AO对象,相当于把0位置的指针指向清除了。那么a函数执行完呢?同理,但是a的AO对象中存储了b函数,那么就相当于把b函数也直接消除了,等下次调用时会重新创建。
这样解释应该清楚了解作用域链与作用域了。希望大家可以指正错误的地方,共同进步~