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