函数的成员[[Scopes]]
js对象有两种成员:上文成员(js语法可以直接访问的成员)和下文成员(底层语法访问的成员),就是[[]]括起来的成员名。
[[Scopes]]是函数的作用域 栈,类似于对象且内部保存的是上层的AO对象。
作用域链
1)函数在定义或者声明时,就有[[Scopes]]作用域栈(只能js引擎使用),里面保存了自己所在的空间的上层的AO对象。
2)函数调用时会创建一个AO对象,AO对象保存在[[Scopes]]对象内部。每次调用都会在自己的作用域链头部插入新的作用域对象。函数调用完后,去除函数作用域链头部的作用域对象。
3)每个函数[[Scopes]]作用域栈都有一个AO对象就是这个函数的上层AO对象(即函数嵌套时上层AO对象就是被嵌套函数的外部函数的AO对象,全局函数的上层AO对象就是GO对象)。
4)每次调用函数会重新执行函数内部代码且每次调用是独立的:每调用一次外层函数所生成的内部函数会有不同的[[Scopes]]也就是不同的独立的作用域链,不能相互访问,但外层函数的上层作用域链是相同的。
5)取变量的值时,自己内部没有就找上层AO对象直到当找到GO对象都没有就报错。
只有当函数fn被调用执行后,函数fm才会生成,才有其[[Scopes]]