2017-04-27 131 views
1

我正在玩這個異步代碼,雖然預計回調將在setTimeout後1 ms後執行,並且val的值將是它當時具有的值,所以我試圖增加val的重新分配,希望克服1ms的延遲,直到執行回調,但無論val添加多少次重新分配,val的值始終是最後一次分配的值。所以問題是,所有這些重新分配都發生得如此之快,以至於在執行回調之前1ms就足以執行它們,或者我在這裏丟失了什麼?異步代碼執行

function asyncFunction(callback) { 
     setTimeout(callback, 1); 
    } 

    var val= '1'; 

    asyncFunction(function() { 
     console.log('The value is ' + val); 
    }); 
    val= '2'; 
    val= '3'; 
    //... 
    //... more asignments 

    val = '1000' 

回答

3

的JavaScript將永遠不會中斷當前正在運行的功能做別的事情。

當你傳遞給setTimeout功能它會被稱爲當所有下列條件爲真:

  • 規定已通過
  • 的最短時間爲setTimeout的時間已經過去了
  • 有沒有其他的功能正在被執行

進一步閱讀:Reasons for delays longer than specified

0

閱讀MDN - Reasons for Delays longer than specified


重要的是要注意的是,函數或代碼片段可直到調用的setTimeout()已終止線程執行是非常重要的。例如:

function foo() { 
    console.log('foo has been called'); 
} 
setTimeout(foo, 0); 
console.log('After setTimeout'); 

將寫入控制檯:

After setTimeout 
foo has been called 

因爲即使setTimeout的是具有零延遲調用,它放在一個隊列,計劃在下次有機會運行,不是馬上。當前正在執行的代碼必須在隊列上的函數執行之前完成,所產生的執行順序可能不符合預期。