setTimeout和setInterval执行问题
window.setTimeout(function(){console.log("1");},0);window.setInterval(function(){console.log("2")},100);console.log("3"); 1234567
> 3 > 1 > 2 > 2 1234
浏览器可以多线程执行,但是JS引擎是单线程执行,定时器会在JS线程追加事件。
必看参考:Javascript中的setTimeout黑魔法;彻底理解setTimeout();
由此,看一个前端面试题:
for (var i = 1;i <= 5;i ++) { setTimeout(function timer() { console.log(i) },i * 1000) } 12345'
提示:作用域、闭包、事件循环
解决方法:
引入 IIFE1;ES6 的 let 定义块级作用域;ES5 的 bind() 函数绑定;妙用setTimeout 的第三之后参数:对内部函数进行传参;timer函数封装调用MDN what`s IIFE ↩︎