作用域+作用域链+预编译+闭包基础

 函数被定义:GO形成

 

 

 

 a()函数还未执行的时候,会生成一个scope属性,生成一个函数的作用域链,在作用域链中保存了GO(全局的执行期上下文)

函数属性[[scope]],[[scope]]保存函数的作用域链

每一个函数在被定义的时候就包含GO(全局的执行上下文)

 

AO

函数执行的前一刻:AO才被形成

 

 所有函数中的AO都是在作用域链中在第一个位置的,我们在找变量的时候都是从作用域链顶端往下找的,

自己的AO永远是在作用域最顶端的,GO只要函数不销毁,一直都会连着的

 

强调每一个函数的作用域链中都有GO

 

 作用域链相当于数组

当b函数被定义时:函数a里面的b函数的作用域链

 

 

当b函数被执行时的前一刻:函数a里面的b函数的作用域链

 

 

 

 b函数自己的ao又形成了,b函数自己的ao放在作用域链的最顶端

 

当b函数被执行结束后,b函数的ao被销毁,回归被定义时的状态

 

 

 

 

当b函数执行完后,a函数也执行完了:a函数的ao也被销毁了,被回归到定义时的装填

 

 

 

 

 

最后:在a函数执行完后,b函数就不再a函数的作用域链的ao上,所以b函数就不存在了,b函数的作用域链也就不存在了

 

 

 

全局执行的前一刻生成GO->函数声明已经定义了

全局执行->函数才被赋值匿名函数了

函数在执行的时候,函数内部的函数才会被声明

函数在声明的时候会声明scope属性的作用域链,函数在执行的(前一刻)的时候才会生成自己的AO

 

总体流程:

 

 

 

 

 

闭包:

 

 

 

 

 

test2被定义时候的作用域链与test1被执行的时候的一样的

 

 

 

 

 return test2的时候;test1里面的ao是被销毁的,但是test2里面还存在test1的ao

test3 = test2()

 

当test3被执行的时候:test2生成自己的ao,也包含test1里面的ao

 

 

总结:当内部函数被返回到外部并保存时候,一定会产生闭包,闭包会产生原来的作用域链不释放,过度的闭包可能会导致内存泄漏

 

加深印象:

 

 

对象的形式形成闭包:

 

 

 

返回函数的写法,一般返回对象就好了

 

posted @ 2021-03-30 14:08  麻花的野望  阅读(102)  评论(0编辑  收藏  举报