关于闭包的整理:

看到一篇文章对于闭包的定义挺好的,整理一下

闭包的定义:在函数A内部定义一个函数B,函数B可以访问函数A中的变量,我们称函数B为闭包

闭包的意义:我们可以间接的访问函数内部的变量

在红宝书中举例大都是:


图一

有的同学定义的闭包的定义为:一个函数内部嵌套一个函数,返回一个函数,并能够访问该函数的内部变量,但其实不完整,下面的例子反驳了这个观点:


图二

循环中也会用闭包解决‘var’定义的问题


图三

首先因为setTimeout是异步函数,会先将循环执行完成以后,再执行,此时i已经是6(变量i是var定义的,所以全局只有一个i,每一次的循环都会更新,即最后i为6)

关于闭包需要了解js的GC机制:

在js中如果一个对象不被引用就会被GC机制回收,否则这个对象就会一直存在。在前面的例子中,B定义在A中,因此B依赖于A,如果B被外界的变量C引用,就说明A间接的被C引用。也就是说A不会被GC回收。

解决办法有三种:

第一种采用闭包的方式:


图四

在上面的代码中使用了立即执行的函数,将变量i传入,赋值给j,此时就将值固定在j上,在函数内部执行timer这个函数的时候使用j这个变量,从而达到目的。

第二种:使用setTimeout的第三个参数的方式


图五

给setTimeout设置参数i,这个参数作为j传入函数timer

第三种方法:使用用let来定义i,形成块级作用域,进而解决问题


图六
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。