闭包:函数的执行导致函数被定义

    1. function fun(n, o){
    2. console.log(o);
    3. return {
    4. fun: function(m){
    5. return fun(m, n);
    6. }
    7. }
    8. }
    9. var a = fun(0); // undefined
    10. a.fun(1); // 0
    11. a.fun(2); // 0
    12. a.fun(3); // 0
    13. var b = fun(0) // undefined
    14. .fun(1) // 0
    15. .fun(2) // 1
    16. .fun(3); // 2
    17. var c = fun(0).fun(1); // undefined // 0
    18. c.fun(2); // 1
    19. c.fun(3); // 1
    代码 过程 输出
    var a = fun(0); n = 0,o = undefined console.log(o); // => undefined
    a.fun(1); function(m) -> m = 1, fun(m, n)
    n 相当于父作用域 (n: 0, o: undefined) 第一个参数 n , n = o = 0
    function(n, o) => function(m, n) => function(1, 0);
    console.log(o); // => 0
    a.fun(2); a 是 function (m) { return fun(m, n) }
    function(m) -> m = 2, fun(m, n) , n 相当于父作用域 (n: 0, o: undefined) 第一个参数 n, n = o = 0,
    function(n, o) => function(m, n) => function(2, 0);
    console.log(o); // => 0
    a.fun(3); a 是 function (m) { return fun(m, n) }
    function(m) -> m = 3, fun(m, n) , n 相当于父作用域 (n: 0, o: undefined) 第一个参数 n, n = o = 0,
    function(n, o) => function(m, n) => function(3, 0);
    console.log(o); // => 0
    var b = fun(0) n = 0,o = undefined console.log(o); // => undefined
    .fun(1); function(m) -> m = 1, fun(m, n) ,
    n 是上一返回的对象为父作用域 (n: 0, o: undefined) 第一个参数 n , n = o = 0,
    function(n, o) => function(m, n) => function(1, 0);
    console.log(o); // => 0
    .fun(2); function(m) -> m = 1, fun(m, n) ,
    n 是上一返回的对象为父作用域 (n: 2, o: 1) 第一个参数 n , n = o = 1,
    function(n, o) => function(m, n) => function(2, 1);
    console.log(o); // => 1
    .fun(3); function(m) -> m = 1, fun(m, n) ,
    n 是上一返回的对象为父作用域 (n: 3, o: 2) 第一个参数 n , n = o = 2,
    function(n, o) => function(m, n) => function(3, 2);
    console.log(o); // => 2
    var c = fun(0).fun(1); n = 0,o = undefined console.log(o); // => undefined
    function(m) -> m = 1, fun(m, n) ,
    n 是上一返回的对象为父作用域 (n: 0, o: undefined) 第一个参数 n , n = o = 0,
    function(n, o) => function(m, n) => function(1, 0);
    console.log(o); // => 0
    c 都是 fun(1) return 的对象所以下面的父作用域都是 (n: 2, o: 1)
    c.fun(2); function(m) -> m = 1, fun(m, n) ,
    n 是上一返回的对象为父作用域 (n: 2, o: 1) 第一个参数 n , n = o = 1,
    function(n, o) => function(m, n) => function(2, 1);
    console.log(o); // => 1
    c.fun(3); function(m) -> m = 1, fun(m, n) ,
    n 是上一返回的对象为父作用域 (n: 2, o: 1) 第一个参数 n , n = o = 1,
    function(n, o) => function(m, n) => function(3, 1);
    console.log(o); // => 1;