var funcs = [];// let's create 3 functionsfor (var i = 0; i < 3; i++) {// and store them in funcsfuncs[i] = function() {// each should log its value.console.log("My value:", i);};}for (var j = 0; j < 3; j++) {// and now let's run each one to seefuncs[j]();}
它输出如下:
我的值:3
我的值:3
我的值:3
而我希望它输出:
我的值:0
我的值:1
我的值:2
当运行函数的延迟是由使用事件侦听器引起时,也会出现同样的问题:
var buttons = document.getElementsByTagName("button");// let's create 3 functionsfor (var i = 0; i < buttons.length; i++) {// as event listenersbuttons[i].addEventListener("click", function() {// each should log its value.console.log("My value:", i);});}
<button>0</button><br /><button>1</button><br /><button>2</button>
…或异步代码,例如使用Promises:
// Some async wait functionconst wait = (ms) => new Promise((resolve, reject) => setTimeout(resolve, ms));
for (var i = 0; i < 3; i++) {// Log `i` as soon as each promise resolves.wait(i * 100).then(() => console.log(i));}
在for in
和for of
循环中也很明显:
const arr = [1,2,3];const fns = [];
for (var i in arr){fns.push(() => console.log("index:", i));}
for (var v of arr){fns.push(() => console.log("value:", v));}
for (const n of arr) {var obj = { number: n }; // or new MyLibObject({ ... })fns.push(() => console.log("n:", n, "|", "obj:", JSON.stringify(obj)));}
for(var f of fns){f();}
这个基本问题的解决方案是什么?