欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

js 循环中的闭包 博客分类: js基础  

程序员文章站 2024-02-10 12:13:22
...

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

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.