for (var i = 0; i < 4; i++) { setTimeout(function() { console.log(i); }, 300); }
答案:输出都是4,js 执行的时候首先会先执行主线程,异步相关的会存到异步队列里,当主线程执行完毕开始执行异步队列, 主线程执行完毕后,此时 i 的值为 4,所以再执行异步队列的时候,打印出来的都是 4
如何修正:
1、 改为es6写法
1 2 3 4 5 6 7 8 9 10 11 12
for (let i = 0; i < 4; i++) { setTimeout(function() { console.log(i); // 输出 0 1 2 3 }, 300); }
// 或者可以这样写 for (let i = 0; i < 4; i++) { setTimeout(() => { console.log(i) // 输出 0 1 2 3 }, 300); }
2、 使用闭包
1 2 3 4 5 6 7 8 9 10
for (var i = 0; i < 4; i++) { setTimeout( (function (i) { returnfunction () { console.log(i); }; })(i), 300 ); }
4.2 为多个dom元素添加click事件
错误写法
1 2 3 4 5 6 7 8 9 10 11
<button>click1</button> <button>click2</button> <button>click3</button> <script> let dom = document.querySelectorAll('button'); for (var i = 0; i < dom.length; i++) { dom[i].onclick = function () { alert(i) } } </script>
如何修正:
1、 改为es6写法
1 2 3 4 5 6
let dom = document.querySelectorAll('button'); for (let i = 0; i < dom.length; i++) { dom[i].onclick = function () { alert(i) } }
2、 使用闭包
1 2 3 4 5 6 7 8
let dom = document.querySelectorAll('button'); for (var i = 0; i < dom.length; i++) { (function (i) { dom[i].onclick = function () { alert(i) } })(i) }