Javascript闭包了解

3,392 阅读1分钟

1. 闭包的概念

  • 简单理解为 所有的函数 都是闭包;
  • 细化理解一下,闭包就是 读取外部变量 的函数;
  • 再细化一下,可以理解为定义在一个 函数内部 读取外部变量的函数。

函数读取外部变量:

var a = 1;
function f1() {
  console.log(a);
}
f1();  // 1

注意:

  • 函数内部声明的局部变量,函数外部无法读取;
  • 子对象可以获取父级对象的变量,但是父级对象无法获取子对象的变量!

2. 闭包的用途

  • 实现私有成员
  • 保护命名空间
  • 避免污染全局变量
  • 变量需要长期驻留在内存中

下面介绍一下变量长期驻留在内存中的现象:

function f1() {
    var a = 1;
    function f2() {
        console.log(a);
        a++;
    }
    return f2;
}
var result_1 = f1();
console.log(result_1);  //打印出来一看,原来是函数f2
result_1();  //1
result_2();  //2
//这时函数f2获得了f1的的变量a驻留在内存中,变成自己的内部的变量,不受外部的影响
var result_2 = f1();
result_2();  //1
result_1();  //3

注意:

  • 由于闭包会使函数中的变量保存在内存中,对内存的消耗很大,不能滥用闭包,会引起性能的问题,在IE中可能导致内存泄露;
  • 闭包会改变父函数内部变量的值。 例如:
function test() {
    var a = 1;
    return {
        getA: function() {
            return a;
        },
        setA: function(c) {
            a = c;
        }
    }
}
var result = test();
result.getA();  //1
result.setA(5);
result.getA();  //5

###参考: