函数被定义: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
总结:当内部函数被返回到外部并保存时候,一定会产生闭包,闭包会产生原来的作用域链不释放,过度的闭包可能会导致内存泄漏
加深印象:
对象的形式形成闭包:
返回函数的写法,一般返回对象就好了
原文转载:http://www.shaoqun.com/a/661742.html
stylenanda官网:https://www.ikjzd.com/w/1675.html
auditor:https://www.ikjzd.com/w/2437
函数被定义:GO形成a()函数还未执行的时候,会生成一个scope属性,生成一个函数的作用域链,在作用域链中保存了GO(全局的执行期上下文)函数属性[[scope]],[[scope]]保存函数的作用域链每一个函数在被定义的时候就包含GO(全局的执行上下文)AO函数执行的前一刻:AO才被形成所有函数中的AO都是在作用域链中在第一个位置的,我们在找变量的时候都是从作用域链顶端往下找的,自己的AO永远
凹凸曼:https://www.ikjzd.com/w/1392
邮乐网:https://www.ikjzd.com/w/1776
vincent:https://www.ikjzd.com/w/1642
ArtFire:https://www.ikjzd.com/w/2489
我被已婚男狂追半年好纠结:http://www.30bags.com/m/a/251052.html
穷男友为约会结帐 向朋友借钱:http://www.30bags.com/a/253143.html
没有评论:
发表评论