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(); // 0counter.set( 3 );counter.increment(); // 4counter.increment(); // 5