看到一篇文章对于闭包的定义挺好的,整理一下
闭包的定义:在函数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,形成块级作用域,进而解决问题