闭包理解

//官方对闭包的解释是: 一个拥有许多变量和绑定了这些变量的环境的表达式( 通常是一个函数), 因而这些变量也是该表达式的一部分。

//我的理解是,闭包就是能够读取其他函数内部变量的函数。

/* 闭包的用途:
它的最大用处有两个,
一个是可以读取函数内部的变量,
另一个就是让这些变量的值始终保持在内存中。 */

/* 闭包的特点:
  1.作为一个函数变量的一个引用,当函数返回时,其处于激活状态。
  2.一个闭包就是当一个函数返回时,一个没有释放资源的栈区。
  简单的说,javascript允许使用内部函数---即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。 */

/* 使用闭包的注意点

1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
*/

function closure() {
var str = "I'm a part variable."; //所以str所占用的资源不会被回收
return function() {
console.log(str);
};
}
var fObj = closure();
fObj();

//函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。
function f1() {
var n = 999;
nAdd = function() {
n += 1;
};

function f2() {
console.log(n);
}
return f2;
}
var result = f1();
result(); // 999
nAdd();
result(); // 1000
原文地址:https://www.cnblogs.com/xzma/p/8022182.html