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.