Javascript 立即执行函数

http://weizhifeng.net/immediately-invoked-function-expression.html

var f1 = function() {
    var res = [];
    var fun = null;
    for(var i = 0; i < 10; i++) {
        fun = function() { console.log(i);};//产生闭包
        res.push(fun);
    }

    return res;
}

var res = f1();
for(var i = 0; i < res.length; i++) {
    res[i]();
}

以上会输出十个10,原因分析如下:

闭包产生,内部函数引用外部函数的变量,并且这个变量所占的内存是不会释放的,就会导致这个i的值是10,

因此内部函数在执行的时候,会输出十个10。

解决这个问题的方式为立即执行函数:

var f1 = function() {
    var res = [];
    var fun = null;
    for(var i = 0; i < 10; i++) {
        (function(index) {
            fun = function() {console.log(index);};
            res.push(fun);
        })(i);
}
    return res;
}

在JavaScript的OOP中,我们可以通过IIFE来实现,如下:

var counter = (function(){
    var i = 0; 
    return {
        get: function(){
            return i;
        },
        set: function( val ){
            i = val;
        },
        increment: function() {
            return ++i;
        }
    };
}());

counter.get(); // 0
counter.set( 3 );
counter.increment(); // 4
counter.increment(); // 5
原文地址:https://www.cnblogs.com/voctrals/p/3713882.html