1.闭包的含义:
闭包就是能够读取其他函数内部变量的函数。
(1).闭包外层是一个函数。
(2).闭包内部都有函数。
(3).闭包会return内部函数。
(4).闭包返回的函数内部不能有return(因为这样就真的结束了)。
(5).执行闭包后,闭包内部变量会存在,而闭包内部函数的内部变量不会存在。
2.作用和原理:
因为闭包只有在被调用时才执行操作,所以它可以被用来定义控制结构。多个函数可以使用一个相同的环境,这使得它们可以通过改变那个环境相互交流。
闭包可以用来实现对象系统。
3.闭包的使用场景:
(1).采用函数引用方式的setTimeout调用。
(2).将函数关联到对象的实例方法。
(3).封装相关的功能集。
4.闭包的特性:
(1).作为函数变量的一个引用。当函数返回时,其处于激活状态。
(2).闭包就是当一个函数返回时,并没有释放资源的栈区。
5.闭包对页面的影响:
通过使用闭包,我们可以做很多事情,比如模拟面向对象的代码风格;更优雅、更简洁的表达出代码;在某些方面提升代码的执行效率。
6.闭包的好处和坏处:
闭包的好处:
(1).逻辑连续,当闭包作为另一个函数调用参数时,避免脱离当前逻辑而单独编写额外逻辑。
(2).方便调用上下文的局部变量。
(3).加强封装性,是第2点的延伸,可以达到对变量的保护作用。
闭包的坏处:
闭包有一个非常严重的问题,即浪费内存,浪费内存不仅仅因为它常驻内存,更重要的是,对闭包的使用不当会造成无效内存的产生。
7.一个闭包的简单实例:
function a(){
var i=0;
function b(){
alert(++i);
}
return b;
}
var c=a();
c();
这是个标准的闭包。在函数a中,定义了函数b,a又return了b的值。
var c=a();
c();
这两句执行很重要。var c=a();在这里执行了a函数,那么a肯定经过了return,按照主流语言的函数特性,现在c的值就是a的返回值。
第二行c()实际执行的就是b的函数。最后不管执行的是谁,会弹出一个值为0的窗口。到此为止,按理论来说所有的生命周期就算是全部结束了。可是如果我们再多执行一行var c=a();c();c();第一次弹出0,第二次弹出执行的却是1.也就是说第一次c()后,a中的i依然保留,所以a在内存中的栈区依然保留。