再探闭包 - pod4g/tool GitHub Wiki

第一个例子

    var n = 1;
    function f1(){
        var n = 999;
        nAdd = function(){
            n+=1;
        }
        function f2(){
            console.log(n);
        }
        return f2;
    }
    var f2 = f1();
    f2(); // 999  把 var n = 999; 注释掉 就是1
    nAdd(); 
    f2(); // 1000 把 var n = 999; 注释掉 就是2
    var f3 = f1();
    f3();// 999 把 var n = 999; 注释掉 就是2

第二个例子


   var name = "window's name";
    var obj = {
        name : "obj's name",
        getNameFunc:function(){
            return function(){
                return this.name;
            }
        }
    };
    var obj2 = {
        name : "obj's name",
        getNameFunc:function(){
            var that = this; // 注意这行
            return function(){
               return that.name;
            }
        }
    };
    console.log(obj.getNameFunc()()); // window's name
    console.log(obj2.getNameFunc()()); // obj's name

第三个例子

function fun(n,o){
  console.log(o);
  return {
    fun: function(m){
      return fun(m,n);
    }
  };
}

var a = fun(0);  // ?
a.fun(1);        // ?        
a.fun(2);        // ?
a.fun(3);        // ?

var b = fun(0).fun(1).fun(2).fun(3);  // ?

var c = fun(0).fun(1);  // ?
c.fun(2);        // ?
c.fun(3);        // ?

// undefined
// 0
// 0
// 0
// undefined, 0, 1, 2
// undefined, 0
// 1
// 1

闭包总结

  1. 只要是函数嵌套函数都是闭包

  2. 闭包分为2种

    • 有意义的闭包,内部函数在外部函数外部执行(一般是return出去),只有有意义的闭包,GC才不会回收
    • 无意义的闭包,内部函数在外部函数内部执行或return出去但是没有接收,此时这种闭包没有意义,GC照样会回收外部函数和内部函数的变量对象

详见我提出的问题关于JavaScript中的闭包的疑问

一个闭包面试题

function fo(){
  var i=0;
  return function(n){
    return n + i++;
  }
}
 
var f=fo();
var a = f(15); // 15
var b = fo()(15); // 15
var c = fo()(20); // 20
var d = f(20); // 21