闭包

所谓闭包就是函数之间相互嵌套。

闭包

现在来解析一下这个函数的执行过程:

先是a被定义的时候,产生scope chain,然后一个指向全局GO

然后a被执行,产生了自己的GO,并且产生了b的定义

scope是作用域链,AO是执行级上下文,也就是所在函数的作用域,GO是全局变量域

闭包

然后b被定义,也就是return b的时候

闭包

这时候a函数已经销毁,但是b函数的scope继承了a的scope,因为b函数在a函数的里面

但是这里b函数被执行的时候,会产生一个自己的AO,会放在scope chain[0]的位置,这里的a是没有定义的(defined),它会先在自己的AO里面找,找不到才会到scope chain[1],也就是从A继承过来的AO 里面找

 

闭包

这个会输出十个10

闭包

这样就可以输出0-9,使用立即执行函数

 

几个闭包的功能:

1.

闭包

这个是利用闭包,在没有全局函数的情况下让一个函数递增打印一个数,其实也就是说这里的asd变量对于函数hi是一个“全局变量”,而这个全局变量是在函数fun的执行级上下文(AO)中的

 

2.

闭包

这个会打印出10个10.

因为在下面调用数组里面的十个函数的时候,寻找i,i此时已经变成了10,很多面试题都会考这个知识点

 

 

闭包还有一个功能是让数据私有化:

闭包

闭包

内部函数能访问ss,但是直接用对象访问是不能访问的

 

例题

闭包

返回number

因为这里使用了立即执行函数,先执行了里面的f(),然后执行了里面的s(),s函数返回是2,所以类型是number

 

闭包

返回string