为什么需要闭包
局部变量无法共享和长久的保存,而全局变量可能造成污染,当我们希望有一种机制可以长
久的保存变量又不会造成全局污染。(闭包就是指有权访问另一个函数作用域中的变量的函数。)
闭包的条件
1.在函数嵌套(一个函数中嵌套另一个函数)的前提下
2.内部函数使用了外部函数的变量(还包括外部函数的参数)
3.外部函数返回了内部函数
闭包的特点
1.让外部访问函数内部变量成为可能;
2.局部变量会常驻在内存中;
3.可以避免使用全局变量,防止全局变量污染;
4.会造成内存泄漏
a.有一块内存空间被长期占用,而不被释放
如:key = value,key 被删除了value 常驻内存中; 局部变量闭包升级版(中间引用的变量) => 自由变量;
b. 可能会造成内存泄漏或溢出。
实例:
// 外部函数
var test = function f1(b,c){
var a = 10;
// 内部函数
function f2(c){
// 内部函数使用了外部函数的变量或者参数
a+b+c;
console.log("结果输出",a+b+c)
}
// 返回内部函数, 这里返回的内部函数就是闭包实例
return f2
}
test(2)(7)// 返回的是一个函数,并且这个函数对局部变量存在引用,形成了闭包的包含关系
闭包的注意事项
1.由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则
会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局
部变量全部删除。
2.闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对(object)
使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private
value),这时一定要小心,不要随便改变父函数内部变量的值。