jsfor (var i = 1; i <= 5; i++) { setTimeout(()=>{ console.log(i);//Mutable variable is accessible from closure },i*1000); }
预期结果输出1到5,每隔一秒,一秒一个
实际结果输出6个6,每隔一秒,一秒一个
为什么
延迟函数的回掉会在循环结束时才执行。即使setTimeout(()=>,0),回调依然是在循环结束后才会被执行。因此会每次输出一个6。
怎么改
ES5
jsfor (var i = 1; i <= 5; i++) { (function () { var j=i setTimeout(()=> { console.log(j); }, j * 1000) })() }
jsfor (var i = 1; i <= 5; i++) { (function (j) { setTimeout(()=> { console.log(j); }, j * 1000) })(i) }
jsfor (var i = 1; i<=5; i++) { setTimeout( function timer(j) { console.log(j) }, i * 1000, i ) }
ES6
jsfor (var i = 1; i <= 5; i++) { let j=i setTimeout(() => { console.log(j); }, j * 1000); }
jsfor (let i = 1; i <= 5; i++) { setTimeout(() => { console.log(i); }, i * 1000); }