1

记录关于闭包的几个例子,网上介绍闭包文章很多,暂时就不作解释。

1.作用域链的延伸

    var global = 1;
    function outer(){
        var outer_local = 2;
        function inner(){
            var inner_local = 3;
            return inner_local + outer_local + global;
        }
        return inner();     //必须return出去
    }

    inner();    // 6

2.全局函数占位符

var inner;  //placeholder
var F = function(){
    var b = 'local variable';
    var N = function(){
        return b;
    }
    inner = N;
}

F();
inner();   // 'local variable'

3.函数参数

function F(param){
    var N = function(){
        return param;
    };
    param++;
    return N;
}

var inner = F(123);
inner();   // 124

4.循环中的闭包

function F(){
    var arr = [], i;
    for(i = 0; i < 3; i++){
        arr[i] = function(){
            return i;
        };
    }
    return arr;
}

var arr = F();
arr[0]();  // 3;
arr[1]();  // 3;
arr[2]();  // 3;

正常输出0,1,2的方式:

function F(){
    var arr = [], i;
    for(i = 0; i < 3; i++){
        arr[i] = (function(x){
            return function(){
                return x;
            }
        }(i));
    }
    return arr;
}

5.迭代器中的闭包

function setup(x){
    var i = 0;
    return function(){
        return x[i++];
    }
}

var next = setup(['a','b','c']);
next();  // 'a'
next();  // 'b'
next();  // 'c'

这些问题如果都理解,那么闭包应该算是比较理解了


芒果屋里的猫
2.3k 声望363 粉丝

同步 -> 异步 -> 回调