三十九.作用域链

99 阅读1分钟

函数的成员[[Scopes]]

js对象有两种成员:上文成员(js语法可以直接访问的成员)和下文成员(底层语法访问的成员),就是[[]]括起来的成员名。

image.png

image.png

[[Scopes]]是函数的作用域 栈,类似于对象且内部保存的是上层的AO对象。

作用域链

1)函数在定义或者声明时,就有[[Scopes]]作用域栈(只能js引擎使用),里面保存了自己所在的空间的上层的AO对象。

2)函数调用时会创建一个AO对象,AO对象保存在[[Scopes]]对象内部。每次调用都会在自己的作用域链头部插入新的作用域对象。函数调用完后,去除函数作用域链头部的作用域对象。

3)每个函数[[Scopes]]作用域栈都有一个AO对象就是这个函数的上层AO对象(即函数嵌套时上层AO对象就是被嵌套函数的外部函数的AO对象,全局函数的上层AO对象就是GO对象)。

4)每次调用函数会重新执行函数内部代码且每次调用是独立的:每调用一次外层函数所生成的内部函数会有不同的[[Scopes]]也就是不同的独立的作用域链,不能相互访问,但外层函数的上层作用域链是相同的。

5)取变量的值时,自己内部没有就找上层AO对象直到当找到GO对象都没有就报错。

image.png

image.png

F773354EA933E7CC5CDDC0C8F5E68DA4.png

只有当函数fn被调用执行后,函数fm才会生成,才有其[[Scopes]]

image.png

image.png

0FFC81E52B2452B14AC777E16F19CCE6.png