Re: [問題] 關於setTimeout寫法

作者: eight0 (欸XD)   2018-09-16 00:42:34
setTimeout 接受兩種參數︰
var timeoutID = scope.setTimeout(function[, delay, param1, param2, ...]);
var timeoutID = scope.setTimeout(code[, delay]);
你的正常寫法和錯誤寫法,分別對應第一種、第二種呼叫方法,這裡就不說明。
來看你的錯誤寫法︰
: setTimeout(console.log(2),1000);
console.log(2) 會呼叫 console.log 這個函式,並傳入參數 2。console.log 這個函式
沒有回傳值,得到的結果是 undefined。也就是說,你的錯誤寫法相當於
1. 執行 console.log(2) 之後
2. 使用 undefined 作為第一個參數傳入 setTimeout︰
setTimeout(undefined,1000);
那為什麼沒有錯誤?
因為當 setTimeout 接受到的第一個參數不是函式的時候,會嘗試將該數值轉成字串。也
就是說,它相當於︰
setTimeout((undefined).toString(),1000);
setTimeout('undefined',1000);
你相當於在一秒後執行了一段內容為「undefined」的程式碼。
基於這個特性,我們其至可以把要執行的程式碼設置成 toString 的回傳內容︰
const foo = {};
foo.toString = () => "console.log('hello')";
setTimeout(foo, 1000);
// 在一秒後印出 hello
參考︰
* MDN 上的 setTimeout 文件︰
https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout
(縮︰https://is.gd/YOpwh2)
* setTimeout 的詳細實作參考︰
https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-settimeout
(縮︰https://is.gd/4DlMT2)
作者: Kenqr (function(){})()   2018-09-16 13:05:00
作者: blues520520 (blues520520)   2018-09-16 13:56:00
謝謝大大解釋
作者: ochitsuite (冷靜點)   2018-09-16 14:18:00
作者: peanut97 (丁丁)   2018-09-16 23:59:00
這個教學太精闢了!!!!
作者: cutekid (可愛小孩子)   2018-09-17 11:17:00
大推(Y)
作者: kyrc (橘子)   2018-09-17 11:49:00
推~
作者: shvanta (vant)   2018-09-28 15:06:00
簡潔明瞭,讚
作者: akccakcctw (947)   2018-09-29 09:48:00
清楚明瞭
作者: pk740111 (霹靂神K)   2018-09-30 01:15:00
解釋得太棒了!
作者: ostkaka (起司蛋糕)   2018-10-10 01:35:00
推 解釋的很清楚
作者: visa9527 (高級伴讀士官長)   2018-10-11 11:16:00
第二種呼叫方法本身是用 eval 在跑嗎 ?
作者: y3k (激流を制するは静水)   2018-10-14 01:34:00
這個還滿有趣的XD 剛試了一下setTimeout({toString:function(){return 'console.log(\'abc\')';}},2000); 是會跑的

Links booklink

Contact Us: admin [ a t ] ucptt.com