您好、欢迎来到现金彩票网!
当前位置:秒速快三计划 > 属性闭包 >

深谈函数的生命周期和闭包

发布时间:2019-06-16 08:39 来源:未知 编辑:admin

  作为行业小生给各位看官大姥爷写这篇文档之前是怀着忐忑写心情,鼓起勇气写出来是源于

  想必有不少看官之前都见到过这道面试题,一道经典闭包面试题,输出为5,5,5,5,5,5.具体

  关于定时器在这里简单介绍下,定时器接收两个参数,在创建的定时器的时候会返回一个唯

  一的标识号,通常会用一个变量保存下来用于传入clearTimer,清除定时器。

  关于定时器的工作原理:for循环每循环一次,定时器中的回调函数,并不会立即执行,而是

  会被依次放入一个由定时器组成的特殊队列结构中等候,等到主程序中所有的函数执行完,才开

  博主最先想到的就是es6语法let,但是let的作用域只在当前块,在这里也就是for循环体内

  看似行得通,其实面试官想要的是5,0,1,2,3,4,同时,博主也承认和面试官本意跑偏了,于

  引入闭包概念,起初看到return时,博主自己也有一些小疑惑,因为博主作为业内小生,面

  对在原生js中占有重量级地位的闭包机制,自然要向黑势力低头,于是就花了更多的时间去查资

  料,看别人的博客,自然也形成了自己对闭包的理解,导致与大神给出的闭包和自己理解的闭包

  有点小不同,我们一直说闭包,也常听别人说闭包,但是什么才是闭包呢,在这里先保留一些悬

  简单理解就为每个储存空间都会有个一属性值记录着被引用的次数,每多一个变量引用属性

  值就会+1,每少一个变量引用属性值就会-1,当属性值为0时,垃圾回收器就会释放该储存空间

  ,就好比去餐厅吃饭,属性值就相当于服务员,一桌客人结单走人,服务员自然就会去清理桌子 。

  在程序开始执行之前,会创建执行环境栈(ESC),用于依次保存正在调用函数的执行环境,

  首先将全局执行环境元素(全局EC)压入栈中(因为浏览器的本身也是一个程序),其次创建全局作

  在开始执行程序时,会将变量a,fun都保存在全局作用域对象window中。

  在定义函数的时候,会创建一个函数对象fun(),保存着fun中的内容,全局变量fun引用的函

  数对象fun(),同时变量对象fun()有一个scope也会指向全局作用域对象,

  当调用函数的时候,会将fun的EC压入到执行环境栈顶部,同时为fun创建一个函数作用域对

  象(活动AO)用来保存着当前在函数fun中定义的局部变量a,fun的EC引着fun的函数作用域

  当函数fun运行完毕后,fun的EC就会从栈顶部移除,fun的函数作用域因为垃圾回收机制同时

  由此可以看出作用域链是由我们的一系列函数作用域对象自上向下组成,最低端由window

  全局作用域对象构成,依次往上是由放入执行环境栈函数的EC顺序构成,当我们当前作用域对象

  没有变量a时,浏览器就会从当前作用域从下访问,直到访问到全局作用域对象。

  因为主要分析闭包,所有博主在前面没有举太多的列子,而是只举了一些简单例子分析下。

  现在来到了我们的重头菜,闭包,想必各位看官都有点厌倦了吧,感觉前面博主太啰里啰嗦了

  按照博主之前对闭包的理解,闭包的概念就是保护着变量i在close的EC出栈的时候不被垃圾

  调用close()之前都和我们在上面的分析基本一致在这里就不在多做分析。

  然后当浏览器执行到return function(){...}时,浏览器就会创建一个函数对象用来保存

  内层函数function,根据前面所讲的函数中都会有个scope用来指向声明函数时函数所在的作用

  域,在这里就是close函数作用域对象,全局变量getClose接收着close返回的内层函数地址,用

  于引着内层函数,所以当close函数执行结束时,内层函数不会被释放掉,因为内层函数的scope

  也引着close的函数作用域对象,外加上作用域链,从而形成闭包,保护了当close的EC出栈时

  close的函数作用域对象也不会一同被释放掉,这是为什么每用一个getClose函数,i就会++的原因,

  内层函数返回时外层函数没有变量接收,从而没有达到闭包最重要的一点,为什么也能形成

  闭包从而保存当前的i,当困惑了很久,博主认为自己对闭包的理解还是差了那么点火候,然后

  又从新看了下关于闭包的资料,从而得出重要一点,当内层函数作为返回值返回时,或者储存在

  博主因为第一次写博客,或者有点地方写的太繁琐从而没有将某些知识点分析的很清晰,

http://isaegil.net/shuxingbibao/241.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有