javascript高级精简版

作用域和作用域链

2019-03-07  本文已影响0人  淡蓝天风

作用域

    函数是一种引用类型也是对象类型(引用值)

    对象 --> 有些属性是无法访问的,是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

上一篇 下一篇

猜你喜欢

热点阅读