Closure,为什么要翻译成“闭包”?看这两个字理解起来怪怪的。。。
不用闭包就会是这样:
因此,使用闭包还需注意一些问题:
① 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
② 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
为什么要闭包,举个栗子:
var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
function myFunction(){
alert(add());
}
myFunction(); // 1
myFunction(); // 2
就像上面的代码那样使用,因为:
var add = (function () {
var counter = 0; // 私有变量可以用到闭包。
return function () {return counter += 1;} // JavaScript 支持嵌套函数。嵌套函数可以访问上一层的函数变量。
})();
function myFunction(){ // 闭包是可访问上一层函数作用域,里变量的函数,即便上一层函数已经关闭。
alert(add());
}
//当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。
//一个闭包就是当一个函数返回时,一个没有释放资源的栈区。
myFunction(); // 1
myFunction(); // 2
不用闭包就会是这样:
function add() {
var counter = 0;
return counter += 1;
}
function myFunction(){
alert(add());
}
myFunction(); // 1
myFunction(); //1
因此,使用闭包还需注意一些问题:
① 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
② 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。