最近面试的时候,经常会遇到这类问题,比如:你怎么理解JS的事件处理机制?什么任务优先级高,什么任务会在主进程中?
我觉得从一个例子出发可以很好的从各方面的去分析,这样也会是一个比较满意的答案 常见的例子: for(var i = 0; i<10; i++) { setTimeout(()=>{ console.log(i) },0) } 这里我们如果不去思考一下很容易得出 0-9 这类答案,仔细思考就会发现这里输出的是10次10 这里我们可以先从JS的处理机制先说起,在JS的处理机制里 同步最高>异步>回调函数 那么这里我们就很容易理解了,那在执行中顺序就是,先执行完同步代码for循环,然后在0ms后执行异步代码setTimeout。 因为在执行的时候setTimeout函数会去找i这个变量,但是由于i在for里面执行完之后已经变为10,由于是var声明对于settimeout而言是全局变量,所以打印了10次10 那如果需要实现打印0-9的话呢? 第一种方法:使用ES6中的let 很容去解决作用域的问题 如果只用ES5的方法呢,我们可以用这样实现 for(var i = 0; i<10; i++) { (function(i){ setTimeout(()=>{ console.log(i) },0) })(i) } 在这里去执行**立即执行函数**,它会迫使每次进入循环之前都会立即去执行代码,从而保证得到i都是不一样的