js 循环中的闭包

     循环中的闭包,下例是一个循环三次的操作,它在每次循环中都会创建一个返回当前循环序号的新函数,该函数会被添加到一个新的数组中,并最终返回。

function f() {
    var a = [];
    var i;
    for(i = 0; i < 3; I++) {
        a[i] = function () {
            return I;
        }
    }
    return a;
}
>>>var a = f();
a[0]
=>3
a[1]
=>3

 
    本来应该是依照循环分别输出0,1,2,然而却是3,3,3,其实是我们在这里创建三个闭包,他们都指向了一个共同的局部变量 i,但是闭包并不会记录他们的值,他们所拥有的只是一个 i 的连接(即引用),因此只能返回 i 的当前值。由于循环结束时 i 的值为3,所以这三个函数都指向了这一共同值。

    如果要实现上例输出0,1,2,可以创建一个自调函数,自调函数如下:

(
     function () {
         alert('boo');
    }
) ()

 其实只需在匿名函数的定义放进一对括号中,然后外面再紧跟一对括号即可。其中,第二队括号起到的作用是“立即调用”的作用,同时它也是我们向匿名函数传递参数的地方。所以可以修改第一个例子为:

function f() {
    var a = [];
    var i;
    for(i = 0; i < 3; I++) {
        a[i] = (function (x) {
            return function() {
                return x;
            }
        }) (i);
    }
    return a;
}
>>>var a = f();

 在这里,我们不再直接创建一个返回i的函数了,而是将i传递给了一个自调函数。在该函数中,i就被赋值给了局部变量x,这样一来,每次迭代中的x就会拥有各自不同的值了。从而可以输出0,1,2.

猜你喜欢

转载自553570934.iteye.com/blog/2303451