闭包的常规缺陷以及唯一一种解决方案
function test () { var arr = []; for (var i = 0; i < 10; i ++) { arr[i] = function () { document.write(i + " "); } } return arr; } var myArr = test(); for (var j = 0; j < 10; j ++) { myArr[j](); }
首先看for循环,循环时arr[i]变化为arr[0]-arr[9],但因后面函数并无执行语句执行,所以循环10次结果为:arr[0] = function () {} ====> arr[9] = function () {},“document.write”语句未执行,属于‘看不见’的状态,只能看到arr数组的每位都是一个function,一共有10个,此时i的值已因循环变成了10。 然后把arr数组return保存到了外部,此后再执行函数,因i的值已为10,执行时终于才读取到document.write语句,所以打印10,执行10次就打印10个10.
打印0-9的方法:
function test () { var arr = []; for (var i = 0; i < 10; i ++) { (function (n) { arr[n] = function () { document.write(n + " "); } }(i)) } return arr; } var myArr = test(); for (var j = 0; j < 10; j ++) { myArr[j](); }
把arr[i] = function () {...}放到一个立即执行函数中,该立即执行函数形参为n实参为i,并执行,通过for循环会生成10个不同的立即执行函数, 每个立即函数执行后剩下的数组结果为arr[0] = function() {...}===>arr[9] =function () {...},将数组保存到外部,再执行的时候,document.write(n + “ ”) ,n的值就是当前数组索引arr[ ]括号内的值,是0-9.

浙公网安备 33010602011771号