闭包是指有权访问另一个函数作用域中的变量的函数。 –from 高程3
举个例子
1 | function makeFunc() { |
按照常理,函数在运行完毕后局部变量便会不可用。一旦makeFunc()函数执行之后,我们会很合理的认为name不可用,但事实并不是这样。
原因是myFunc变成一个闭包了。
闭包特点:1.闭包函数作用于window,只能取得包含函数中任何变量的最后一个值。2.由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
一个常见错误:在循环中使用闭包
See the Pen PGqRyx by abcdGJJ (@abcdGJJ) on CodePen.
可以看到,每次点击后弹出的都是第4个元素。这是为什么呢?
原因其实是onclick绑定了一个匿名函数形成一个闭包,而闭包只能访问最后一个值,所以结果都是4
我们可以通过一些方法来让它输出期望的结果
将变量i保存在每个li上
1 | for (var i = 0; i < list.length; i++) { |
使用闭包
1 | for (var i = 0; i < list.length; i++) { |