闭包:
官方定义:有权访问另一个函数作用域中变量的函数,这样子说看起就很抽象,其实这也就是一个作用域可以访问另一个作用域里面的变量。
更全面的解释就是在js中,变量的作用域属于函数作用域,在函数执行后作用域就会被清理、内存也随之回收,但是由于闭包是建立在一个函数内部的子函数,由于其可访问上级作用域的原因,即使上级函数执行完,作用域也不会随之销毁,这时的子函数——也就是闭包,便拥有了访问上级作用域中的变量的权限,即使上级函数执行完后作用域内的值也不会被销毁。
闭包:
输出是:10
我们fun 这个函数作用域 访问了另外一个函数 fn 里面的局部变量 num,所以这就是一个闭包了;本来呢,我们全局变量 是没办法拿到局部变量的,但是有闭包,就可以,闭包的好处就是可以延伸变量的作用范围。
闭包的应用:
这样子你最终显示哪个都是4,因为for循环只是给li绑定事件,但是里面的函数代码并不会执行,这个执行是在你点击的时候才执行的,但是此时的i已经是4,所以所有的都打印出4来了。这种情况可以使用闭包解决:
这样子的作用就是利用for创造4个立即执行函数,每个立即执行函数都是闭包,所以i的值会一直保存在内存中,这样子点击的时候就可以拿到i的值了。
闭包有好处也有坏处,坏处就是会导致内存泄漏,所以不能滥用闭包