「setTimeout() difference between parameters as string or function」相關筆記

原始問題

setTimeout()傳入「與函式一致的字串」作為參數時,為何輸出的結果與「直接傳入函式」不同?

第一組程式碼:

// 傳入與函式內容一樣的字串作為參數
setTimeout(console.log('first'), 0);
console.log('second');
// 輸出結果:
// >> first
// >> second

第二組程式碼:

// 直接傳入函式作為參數
setTimeout(() => console.log('first'), 0);
console.log('second');
// 輸出結果:
// >> second
// >> first

解析 1

延伸問題:在迴圈內

第三組程式碼:

for (var i = 0; i < 2; i++) {
  setTimeout(console.log(i));
}
// 輸出結果:
// >> 0
// >> 1
// >> 39607 (timeoutID) (在DevTool執行才會有這行輸出)
// 在Node.js環境執行此段程式碼會回傳TypeError : Callback must be a function. Received undefined

第四組程式碼:

for (var i = 0; i < 2; i++) {
  setTimeout(() => console.log(i));
}
// 輸出結果:
// >> 39670 (timeoutID) (在DevTool執行才會有這行輸出,以Node.js執行不會有這行)
// >> 2
// >> 2

解析 2

瀏覽器環境圖,取自:How JavaScript works: an overview of the engine, the runtime, and the call stack

參考文件