闭包(closure)
一.概念
闭包指的是有权访问另一个函数作用域的变量的函数。
二.为什么使用闭包
我们知道js中函数内部可以访问全局的变量,例如:
// An highlighted block
var n=1999;
function f(){
alert(n);
}
f(); //1999
一般来说,当函数执行完毕之后,局部活动对象(类似c++中的局部变量)就会被销毁,内存中仅保存全局执行环境的变量对象(c++的全局变量)。闭包的情况与之有所不同。
// An highlighted block
function f1(){
var i=999;
iAdd=function(){i+=1}
function f2(){
alert(i);
}
return f2;
}
var result=f1();
result(); // 999
iAdd();
result(); // 1000
--------这边函数f2就是一个闭包,通过上面这段代码我们能够发现,在第一次调用完之后,局部变量 n 并未被释放!这就是闭包的用途。
(1)可以在函数外访问函数的局部变量
(2)可以让这些变量保存,不在函数被调用完之后立即被释放内存。(这与JavaScript采用的垃圾回收机制有关)
三.闭包使用的注意事项
1.内存泄漏
IE9之前的版本对于js对象和COM对象使用不同的垃圾收集方式,因此在这种版本中闭包某些元素可能无法销毁,有可能导致网页性能或者内存泄露的问题。
2.安全性问题
闭包可以在函数外部,改变函数内部变量的值。因此在使用的闭包的时候一定要慎用,防止不小心修改函数内某个变量的值从而导致错误。