作用域
函数是一种引用类型也是对象类型(引用值)
对象 --> 有些属性是无法访问的,是JS引擎中固有的隐式属性外界无法访问
Scope作用
是函数创建时,生成的一个JS内部的隐式属性
是函数存储作用域链的容器(也就是AO ,GO)
AO
AO只有在被执行的时候才会生成AO,预编译时不会生成AO
AO是函数的执行期上下文,函数在执行完成以后,AO是要销毁的,再次执行值,AO是重新生成的,AO是一个即时(暂时)的存储容器,不能长时间储存
每一个函数在被定义的时候都是包含GO的,也就是没有执行该函数的时候
当函数被执行时(也就是前一刻),在执行预编译,预编译时生成了AO
所有的AO都是排在自身的最顶端的,所以函数访问外部可以,但是不能被外部访问,但是只证明了一半,因为在执行的过程中,所有的作用域链都是从顶端向下开始执行(找)的,所以自己的AO一定是排在作用域链的最顶端的,GO就这样被挤下去了
GO
GO是全局的执行期上下文,GO在全局执行的前一刻,函数的声明已经定义好了(也已经预编译了)
预编译的两个过程:1.找变量声明 和 2.找函数声明
每一个函数的作用域链上都有GO
关于定义问题
永远都是上级在执行的时候,内部的在预定义
如,全局在执行的时候,全局函数在被预定义,全员函数在执行的时候,内部函数在被预定义
不管是 A 的 AO 还是 B 的 AO,访问的地址都是一样的
栈内存只存储堆内存中的地址,不会进行复制(只是单纯的根据地址找对应的内容)
重点
当函数被定义的时候,就已经形成了作用域,作用域链也跟随形成,最后作用域链中也已经存在GO了,
除非在当前函数在被执行时(也就是执行的那一刹那),才会形成自己的AO
网友评论