最近面試的時候,常常會遇到這類問題,好比:你怎麼理解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都是不同的