今天捣鼓了一下关于闭包的几种情况,记录一下下哈
这个例子首先是这样的
function createFunctions(){ var result=new Array(); for(var i=0;i<10;i++){ result[i]=function(){return i;}; } alert(i); return result; } alert(creatwFunctions()); alert(createFunctions()[0]());
心里知道输出的是0~9,第一个alert不是,它是这样的function(){return i;};result[i]=function(){return i;};result[i]=function(){return i;};.......然后就凌乱了。
傻完了后,第二个alert为10。
当然了,10也不是我内心的想法。我的想法是它
function creatFunctions(){ var result=new Array(); for(var i=0;i<10;i++){ result[i]=(function(num){return num;})(i); } return result; } alert(creatFunctions()); //输出结果是0,1,2,3,4,5,6,7,8,9
这个才是我要的,那它们的区别呢?
首先,这两个都是闭包(占用函数外部的变量,是变量无法消除)。
第一种情况,i永远都是那个i(相当于一个指针),存入result数组里面的值其实就是指针i,指向的那个具体的值也是同一个,随着循环不断在变化,循环完成了,值定下来了(等于10),数组里装的值也就定下来了(全部是10)。
第二种情况呢,是借用立即执行函数。(function(){})(i);立即执行函数是把i作为参数传到函数里面。
这个好处是这样的:参数是按值传递,这样函数获得的i就不是一个指针了,而是i的一个副本。那么,数组里面的各个值(函数执行后返回得值)就毫无瓜葛,你是你,我是我。
还有一种情况
function creatFunctions(){ var result=new Array(); for(var i=0;i<10;i++){ result[i]=(function(num){ return function(){return num;}; })(i); } return result; }
alert(creatFunctions());//得到一系列的返回函数 alert(creatFunctions()[1]());// 1
这个和上面的效果是一样的,只是在取数组值上方法不一样。
上面立即执行的函数是return num,可直接得到数组中num值。后面的一种return function(){return num},返回的是一个函数,数组中存的也是函数,获得值时要调用数组中的函数以得到函数的值(说明白点就是0,1,2...)
以上的例子是书本里面的,然后把自己的理解加书上的讲述综合一下,初学者,有错误请指正谅解哈!