# 闭包


一个老生常谈的话题,再简单的捋捋!

# 一个函数内部的函数

function f1(){
    var n = 1;
    
    function f2(){
        alert(1); 
    }

    return f2;
}

var result = f1();

result(); // 1
1
2
3
4
5
6
7
8
9
10
11
12
13
  • 外部函数并不能直接访问f1的内部变量n,但是可以通过其内部暴露的方法访问
  • 一种访问函数内部变量的手段

# 在函数外部对函数内部的局部变量进行操作


function f1(){
    var n = 1;

    function add(){
        n++;
    }

    function f2(){
        console.log(n);
    }

    return {
        get: f2,
        add: add
    };
}

var res = f1(); 

res.get(); // n = 1
res.add(); // add
res.get(); // n = 2

var res_b = f1();

res_b.get(); // n = 1
res_b.add(); 
res_b.get(); // n = 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

其中:result = f1() = {f2, add},所以result的最终指向是包含f2的对象,但是f2内部用到了其父函数f1的变量n;这就导致f1始终在内存中没有释放。所以当执行addn++,这时n = 2;

上次更新: 3/5/2019, 9:21:59 PM