闭包问题

今天捣鼓了一下关于闭包的几种情况,记录一下下哈

这个例子首先是这样的

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...)

以上的例子是书本里面的,然后把自己的理解加书上的讲述综合一下,初学者,有错误请指正谅解哈!

我要慢慢的往前爬啊,喵~
原文地址:https://www.cnblogs.com/hellolm/p/4396860.html