Javascript闭包了解

1. 闭包的概念

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

函数读取外部变量:

1
2
3
4
5
var a = 1;
function f1() {
console.log(a);
}
f1(); // 1

注意:

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

    2. 闭包的用途

  • 实现私有成员

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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中可能导致内存泄露;
  • 闭包会改变父函数内部变量的值。
    例如:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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

###参考: