闭包在JavaScript高级程序设计(第3版)中是这样描述:闭包是指有权访问另一个函数作用域中的变量的函数。
那么闭包的作用也就很明显了。
1. 可以在函数的外部访问到函数内部的局部变量。
2. 让这些变量始终保存在内存中,不会随着函数的结束而自动销毁。
闭包表现表现形式,这里举个例子:
function foo() { var a = 10; function bar() { a *= 2; return a; } return bar; } var baz = foo(); // baz is now a reference to function bar. console.log(baz()); // returns 20. console.log(baz()); // returns 40. console.log(baz()); // returns 80. var blat = foo(); // blat is another reference to bar. console.log(blat()); // returns 20, because a new copy of a is being used.
示例中,baz和balt各有各的作用域及a的一个副本,而且只有他们自己能对其进行修改。
所谓“闭包”,就是在构造函数体内定义另外的函数作为目标对象的方法函数,而这个对象的方法函数反过来引用外层函数体中的临时变量。
这使得只要目标 对象在生存期内始终能保持其方法,就能间接保持原构造函数体当时用到的临时变量值。
尽管最开始的构造函数调用已经结束,临时变量的名称也都消失了,但在目标对象的方法内却始终能引用到该变量的值,而且该值只能通这种方法来访问。
即使再次调用相同的构造函数,但只会生成新对象和方法,新的临时变量只是对应新 的值,和上次那次调用的是各自独立的
三、闭包注意点
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。
解决方法是,在退出函数之前,将不使用的局部变量全部删除。