从一个for循环分析JS的事件处理机制

最近面试的时候,经常会遇到这类问题,比如:你怎么理解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都是不一样的

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理