從一個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都是不同的
相關文章
相關標籤/搜索