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

30次阅读

共计 582 个字符,预计需要花费 2 分钟才能阅读完成。

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

正文完
 0