Windowï¼setTimeout() æ¹æ³
åºçº¿
广æ³å¯ç¨
*
èª 2015å¹´7æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
* æ¤ç¹æ§çæäºé¨åçæ¯æç¨åº¦å¯è½ææä¸åã
Window æ¥å£ç setTimeout() æ¹æ³è®¾ç½®ä¸ä¸ªå®æ¶å¨ï¼ä¸æ¦å®æ¶å¨å°æï¼å°±ä¼æ§è¡ä¸ä¸ªå½æ°ææå®ç代ç çæ®µã
è¯æ³
setTimeout(code)
setTimeout(code, delay)
setTimeout(functionRef)
setTimeout(functionRef, delay)
setTimeout(functionRef, delay, param1)
setTimeout(functionRef, delay, param1, param2)
setTimeout(functionRef, delay, param1, param2, /* â¦, */ paramN)
åæ°
functionRef-
å½å®æ¶å¨å°æåè¦æ§è¡ç彿°ã
code-
è¿æ¯ä¸ä¸ªä»£æ¿è¯æ³ï¼å è®¸ä½ å å«å¨å®æ¶å¨å°æåç¼è¯åæ§è¡çå符串èé彿°ãè¿ä¸ªè¯æ³å 为ä¸
eval()åå¨ç¸åçå®å ¨é£é©æä»¥ä¸æ¨è使ç¨ã delayå¯é-
宿¶å¨å¨æ§è¡æå®ç彿°æä»£ç ä¹ååºè¯¥çå¾ çæ¶é´ï¼å使¯æ¯«ç§ã妿çç¥è¯¥åæ°ï¼å使ç¨å¼ 0ï¼æå³çâç«å³âæ§è¡ï¼æè æ´åç¡®å°è¯´ï¼å¨ä¸ä¸ä¸ªäºä»¶å¾ªç¯æ§è¡ã
注æï¼æ 论æ¯åªç§æ åµï¼å®é å»¶è¿å¯è½ä¼æ¯é¢æé¿ä¸äºï¼åè§ä¸æ¹å»¶æ¶æ¯æå®å¼æ´é¿çåå ä¸èçåè¿°ã
è¿è¦æ³¨æçæ¯ï¼å¦æå¼ä¸æ¯æ°åï¼éå¼çç±»å强å¶è½¬æ¢ä¼éé»å°å°å ¶è½¬æ¢ä¸ºæ°åââè¿å¯è½å¯¼è´ææ³ä¸å°çã令人æè®¶çç»æï¼åè§éæ°åå»¶è¿å¼è¢«éé»å°å¼ºå¶è½¬å为æ°å以è·å示ä¾ã
param1ãâ¦â¦ãparamNå¯é-
ä¼è¢«ä¼ éç»ç±
functionRefæå®ç彿°çéå åæ°ã
è¿åå¼
è¿åå¼ timeoutID æ¯ä¸ä¸ªæ£æ´æ°ï¼è¡¨ç¤ºç± setTimeout() è°ç¨å建ç宿¶å¨çæ è¯ç¬¦ãå¯ä»¥å°è¿ä¸ªå¼ä¼ éç» clearTimeout() æ¥åæ¶è¯¥å®æ¶å¨ã
å¨å®æ¶å¨ä»ç¶æ¿æ´»çæ
åµä¸ï¼ä¿è¯ timeoutID å¼ä¸ä¼è¢«åä¸çªå£ï¼windowï¼ä¸çåç» setTimeout() æ setInterval() è°ç¨éå¤ä½¿ç¨ãç¶èï¼ä¸åç对象使ç¨ä¸åç ID æ± ã
æè¿°
ä½¿ç¨ clearTimeout() åæ¶è¶
æ¶ã
妿è¦éå¤è°ç¨æä¸ªå½æ°ï¼å¦æ¯ N 毫ç§è°ç¨ä¸æ¬¡ï¼ï¼èèä½¿ç¨ setInterval()ã
éæ°åå»¶è¿å¼è¢«éé»å°å¼ºå¶è½¬å为æ°å
妿è°ç¨ setTimeout() ç delay å¼ä¸æ¯æ°åï¼éå¼çç±»å强å¶è½¬æ¢ä¼éé»å°å°å
¶è½¬æ¢ä¸ºæ°åãä¾å¦ï¼ä¸é¢ç代ç å¨ delay å¼ä¸é误å°ä½¿ç¨äºå符串 "1000"ï¼è䏿¯æ°å 1000ââä½å®ä»ç¶ææï¼å 为å½ä»£ç è¿è¡æ¶ï¼å符串被强å¶è½¬æ¢ææ°å 1000ï¼æä»¥ä»£ç å¨ 1 ç§åæ§è¡ã
setTimeout(() => {
console.log("å»¶è¿äº 1 ç§ã");
}, "1000");
ä½å¨è®¸å¤æ
åµä¸ï¼éå¼ç±»å强å¶è½¬æ¢ä¼å¯¼è´ææ³ä¸å°çã令人æè®¶çç»æãä¾å¦ï¼å½ä¸é¢ç代ç è¿è¡æ¶ï¼å符串 "1 ç§" æç»è¢«å¼ºå¶è½¬æ¢ä¸ºæ°å 0ââå æ¤ï¼ä»£ç ç«å³æ§è¡ï¼æ²¡æå»¶è¿ã
setTimeout(() => {
console.log("å»¶è¿äº 1 ç§ã");
}, "1 ç§");
å æ¤ï¼ä¸è¦ä½¿ç¨å符串æ¥è¡¨ç¤º delay å¼ï¼èè¦å§ç»ä½¿ç¨æ°åï¼
setTimeout(() => {
console.log("å»¶è¿äº 1 ç§ã");
}, 1000);
ä¸å¼æ¥å½æ°é å
setTimeout() æ¯å¼æ¥å½æ°ï¼æå³ç计æ¶å¨å½æ°å°ä¸ä¼æå彿°æ ä¸å
¶ä»å½æ°çæ§è¡ãä¹å°±æ¯è¯´ï¼ä½ ä¸è½ä½¿ç¨ setTimeout() æ¥å¨å½æ°æ ä¸ä¸ä¸ä¸ªå½æ°æ§è¡åæ§è¡âæåâæä½ã
æ¥ç以ä¸ç¤ºä¾ï¼
setTimeout(() => {
console.log("è¿æ¯ç¬¬ä¸æ¡æ¶æ¯");
}, 5000);
setTimeout(() => {
console.log("è¿æ¯ç¬¬äºæ¡æ¶æ¯");
}, 3000);
setTimeout(() => {
console.log("è¿æ¯ç¬¬ä¸æ¡æ¶æ¯");
}, 1000);
// è¾åºï¼
// è¿æ¯ç¬¬ä¸æ¡æ¶æ¯
// è¿æ¯ç¬¬äºæ¡æ¶æ¯
// è¿æ¯ç¬¬ä¸æ¡æ¶æ¯
请注æï¼ç¬¬ä¸ä¸ªå½æ°å¨è°ç¨ç¬¬äºä¸ªå½æ°ä¹å没æå»ºç«ä¸ä¸ª 5 ç§éçâæåâãç¸åï¼ç¬¬ä¸ä¸ªå½æ°è¢«è°ç¨ï¼ä½çå¾ 5 ç§åæ§è¡ãå½ç¬¬ä¸ä¸ªå½æ°çå¾ æ§è¡æ¶ï¼ç¬¬äºä¸ªå½æ°è¢«è°ç¨ï¼å¨ç¬¬äºä¸ªå½æ°æ§è¡ä¹åï¼å¯¹å ¶è¿è¡äº 3 ç§ççå¾ ãç±äºç¬¬ä¸ä¸ªå第äºä¸ªå½æ°ç宿¶å¨é½æ²¡æå®æï¼ç¬¬ä¸ä¸ªå½æ°è¢«è°ç¨å¹¶é¦å å®æå ¶æ§è¡ã第äºä¸ªå½æ°ç´§éå ¶åãå¨ç¬¬ä¸ä¸ªå½æ°ç宿¶å¨æç»å®æåï¼æåæ§è¡è¯¥å½æ°ã
è¦å建ä¸ä¸ªè¿ç¨ï¼å ¶ä¸ä¸ä¸ªå½æ°åªæå¨å¦ä¸ä¸ªå½æ°å®æåæä¼è§¦åï¼è¯·åè§å ³äº Promise çææ¡£ã
å ³äºâthisâçé®é¢
å½ä½ å setTimeout() ä¼ éä¸ä¸ªå½æ°æ¶ï¼è¯¥å½æ°ä¸ç this æåè·ä½ çææå¯è½ä¸åï¼è¿ä¸ªé®é¢å¨ JavaScript åèä¸è¿è¡äºè¯¦ç»è§£éã
ç± setTimeout() æ§è¡çä»£ç æ¯ä»ä¸ä¸ªç¬ç«äºè°ç¨ setTimeout ç彿°çæ§è¡ç¯å¢ä¸è°ç¨çã为被è°ç¨ç彿°è®¾ç½® this å
³é®åçé常è§åéç¨ï¼å¦æä½ 没æå¨è°ç¨ä¸æç¨ bind 设置 thisï¼å®å°é»è®¤ä¸º windowï¼æ globalï¼å¯¹è±¡ï¼çè³æ¯å¨ä¸¥æ ¼æ¨¡å¼ä¸ï¼ãå®å°ä¸è°ç¨ setTimeout ç彿°ç this å¼ä¸ä¸æ ·ã
请ç以ä¸ç¤ºä¾ï¼
const myArray = ["é¶", "ä¸", "äº"];
myArray.myMethod = function (sProperty) {
console.log(arguments.length > 0 ? this[sProperty] : this);
};
myArray.myMethod(); // è¾åºâé¶ï¼ä¸ï¼äºâ
myArray.myMethod(1); // è¾åºâä¸â
ä¸é¢è¿æ®µä»£ç æ£å¸¸å·¥ä½ï¼å½è°ç¨ myArray æ¶ï¼å®ç this 设å®ä¸º myArrayï¼æ
å¨å½æ°ä¸ this[sProperty] ä¸ myArray[sProperty] çä»·ãç¶èï¼å¨ä»¥ä¸ç¤ºä¾ä¸ï¼
setTimeout(myArray.myMethod, 1.0 * 1000); // å¨ 1 ç§åè¾åºâ[object Window]â
setTimeout(myArray.myMethod, 1.5 * 1000, "1"); // å¨ 1.5 ç§åè¾åºâundefinedâ
ä¼ éç» setTimeout çæ¯ myArray.myMethod 彿°ï¼å½è°ç¨å®çæ¶åï¼this 没ææåï¼æ
å
¶é»è®¤æå window 对象ã
å¨ setTimeout ä¸ä¹æ²¡æä¼ é thisArg çé项ï¼å°±åå¨ forEach() å reduce() çæ°ç»æ¹æ³ä¸ä¸æ ·ãå¦ä¸æ¹ç¤ºä¾æç¤ºï¼ä½¿ç¨ call æ¥è®¾ç½® this ä¹ä¸èµ·ä½ç¨ã
setTimeout.call(myArray, myArray.myMethod, 2.0 * 1000); // åºé
setTimeout.call(myArray, myArray.myMethod, 2.5 * 1000, 2); // åæ ·ä¼åºé
è§£å³æ¹æ¡
使ç¨å è£ å½æ°
ä¸ä¸ªéç¨çæ¹æ³æ¯ç¨å
è£
彿°æ¥å° this 设置为æéè¦çå¼ï¼
setTimeout(function () {
myArray.myMethod();
}, 2.0 * 1000); // å¨ 2 ç§åè¾åºâé¶ï¼ä¸ï¼äºâ
setTimeout(function () {
myArray.myMethod("1");
}, 2.5 * 1000); // å¨ 2.5 ç§åè¾åºâä¸â
å è£ å½æ°ä¹å¯ä»¥æ¯ç®å¤´å½æ°ï¼
setTimeout(() => {
myArray.myMethod();
}, 2.0 * 1000); // å¨ 2 ç§åè¾åºâé¶ï¼ä¸ï¼äºâ
setTimeout(() => {
myArray.myMethod("1");
}, 2.5 * 1000); // å¨ 2.5 ç§åè¾åºâä¸â
ä½¿ç¨ bind()
æè
ï¼ä¹å¯ä»¥ä½¿ç¨ bind() æ¥ä¸ºææå¯¹ç¹å®å½æ°çè°ç¨è®¾ç½® this çå¼ï¼
const myArray = ["é¶", "ä¸", "äº"];
const myBoundMethod = function (sProperty) {
console.log(arguments.length > 0 ? this[sProperty] : this);
}.bind(myArray);
myBoundMethod(); // è¾åºâé¶ï¼ä¸ï¼äºâãå 为âthisâå¨å½æ°ä¸ç»å®å°äº myArray
myBoundMethod(1); // è¾åºâä¸â
setTimeout(myBoundMethod, 1.0 * 1000); // ç±äºç»å®é®é¢ï¼è¿æ¯å¨ 1 ç§åè¾åºâé¶ï¼ä¸ï¼äºâ
setTimeout(myBoundMethod, 1.5 * 1000, "1"); // å¨ 1.5 ç§åè¾åºâä¸â
ä¼ éå符串åé¢é
å°å符串è䏿¯å½æ°ä¼ éç» setTimeout() ä¸ä½¿ç¨ eval() å
·æç¸åçé®é¢ã
// ä¸è¦è¿æ ·å
setTimeout("console.log('ä½ å¥½ä¸çï¼');", 500);
// è¿æ ·å
setTimeout(() => {
console.log("ä½ å¥½ä¸çï¼");
}, 500);
ä¼ éç» setTimeout() çå符串æ¯å¨å
¨å±ä¸ä¸æä¸æ±å¼çï¼å æ¤å½å符串被æ±å¼ä¸ºä»£ç æ¶ï¼setTimeout() 被è°ç¨çä¸ä¸æä¸çå±é¨ç¬¦å·å°ä¸å¯ç¨ã
å»¶æ¶æ¯æå®å¼æ´é¿çåå
æå¾å¤å ç´ ä¼å¯¼è´è¶ æ¶æ¯è®¾å®ç颿弿´ä¹ ï¼æ¬èå°è®¨è®ºæå¸¸è§çåå ã
åµå¥è¶ æ¶
æ£å¦ HTML æ åä¸è§å®ç飿 ·ï¼ä¸æ¦å¯¹ setTimeout çåµå¥è°ç¨è¢«å®æäº 5 æ¬¡ï¼æµè§å¨å°å¼ºå¶æ§è¡ 4 毫ç§çæå°è¶
æ¶ã
è¿å¯ä»¥å¨ä¸é¢çä¾åä¸çå°ï¼å¨è¿ä¸ªä¾åä¸ï¼æä»¬åµå¥äºå¯¹ setTimeout çè°ç¨ï¼å»¶è¿ä¸º 0 毫ç§ï¼å¹¶è®°å½æ¯æ¬¡è°ç¨å¤çç¨åºæ¶çå»¶è¿ãå忬¡ï¼å»¶è¿çº¦ä¸º 0 毫ç§ï¼ä¹å约为 4 毫ç§ï¼
<button id="run">è¿è¡</button>
<table>
<thead>
<tr>
<th>ä¹å</th>
<th>ç°å¨</th>
<th>å®é
å»¶æ¶</th>
</tr>
</thead>
<tbody id="log"></tbody>
</table>
let last = 0;
let iterations = 10;
function timeout() {
// è®°å½è°ç¨æ¶é´
logline(new Date().getMilliseconds());
// å¦æè¿æ²¡ç»æï¼è®¡å䏿¬¡è°ç¨
if (iterations-- > 0) {
setTimeout(timeout, 0);
}
}
function run() {
// æ¸
餿¥å¿
const log = document.querySelector("#log");
while (log.lastElementChild) {
log.removeChild(log.lastElementChild);
}
// åå§åè¿ä»£æ¬¡æ°åå¼å§æ¶é´æ³
iterations = 10;
last = new Date().getMilliseconds();
// å¼å¯å®æ¶å¨
setTimeout(timeout, 0);
}
function logline(now) {
// è¾åºä¸ä¸ä¸ªæ¶é´æ³ãæ°çæ¶é´æ³åå·®å¼
const tableBody = document.getElementById("log");
const logRow = tableBody.insertRow();
logRow.insertCell().textContent = last;
logRow.insertCell().textContent = now;
logRow.insertCell().textContent = now - last;
last = now;
}
document.querySelector("#run").addEventListener("click", run);
éæ´»å¨æ ç¾çè¶ æ¶
为äºä¼ååå°æ ç¾çå è½½æèï¼ä»¥åéä½èçµéï¼ï¼æµè§å¨ä¼å¨éæ´»å¨æ ç¾ä¸å¼ºå¶æ§è¡ä¸ä¸ªæå°çè¶
æ¶å»¶è¿ã妿ä¸ä¸ªé¡µé¢æ£å¨ä½¿ç¨ Web é³é¢ API AudioContext ææ¾å£°é³ï¼ä¹å¯ä»¥ä¸æ§è¡è¯¥å»¶è¿ã
è¿æ¹é¢çå ·ä½æ åµä¸æµè§å¨æå ³ï¼
- Firefox æ¡é¢çå Chrome é坹䏿´»å¨æ ç¾é½æä¸ä¸ª 1 ç§çæå°è¶ æ¶å¼ã
- å®åç Firefox æµè§å¨å¯¹ä¸æ´»å¨çæ ç¾æä¸ä¸ªè³å° 15 åéçè¶ æ¶ï¼å¹¶å¯è½å®å ¨å¸è½½å®ä»¬ã
- 妿æ ç¾ä¸å
å«
AudioContextï¼Firefox ä¸ä¼å¯¹éæ´»å¨æ ç¾è¿è¡éæµã
追踪åèæ¬çéæµ
Firefox 对å®è¯å«ä¸ºè¿½è¸ªåèæ¬çèæ¬å®æ½é¢å¤çéæµãå½å¨åå°è¿è¡æ¶ï¼éæµçæå°å»¶è¿ä»ç¶æ¯ 4 毫ç§ãç¶èï¼å¨åå°æ ç¾ä¸ï¼éæµçæå°å»¶è¿æ¯ 10000 毫ç§ï¼å³ 10 ç§ï¼ï¼å¨ææ¡£é¦æ¬¡å è½½å 30 ç§å¼å§çæã
åè§è·è¸ªä¿æ¤ä»¥äºè§£æ´å¤ä¿¡æ¯ã
è¶ æ¶å»¶è¿
妿页é¢ï¼ææä½ç³»ç»/æµè§å¨ï¼æ£å¿äºå
¶ä»ä»»å¡ï¼è¶
æ¶ä¹å¯è½æ¯é¢æçæãéè¦æ³¨æçä¸ä¸ªéè¦æ
嵿¯ï¼å¨è°ç¨ setTimeout() ç线ç¨ç»æä¹åï¼å½æ°æä»£ç çæ®µä¸è½è¢«æ§è¡ãä¾å¦ï¼
function foo() {
console.log("foo 被è°ç¨");
}
setTimeout(foo, 0);
console.log("setTimeout ä¹å");
ä¼å¨æ§å¶å°è¾åºï¼
setTimeout ä¹å foo 被è°ç¨
åºç°è¿ä¸ªç»æçåå æ¯ï¼å°½ç®¡ setTimeout 以é¶å»¶è¿æ¥è°ç¨å½æ°ï¼ä½è¿ä¸ªä»»å¡å·²ç»è¢«æ¾å
¥äºéåä¸å¹¶ä¸çå¾
ä¸ä¸æ¬¡æ§è¡ï¼å¹¶ä¸æ¯ç«å³æ§è¡ï¼éåä¸ççå¾
彿°è¢«è°ç¨ä¹åï¼å½å代ç å¿
é¡»å
¨é¨è¿è¡å®æ¯ï¼å æ¤è¿éè¿è¡ç»æå¹¶é颿³ç飿 ·ã
å¨å è½½é¡µé¢æ¶æ¨è¿è¶ æ¶
å½åæ ç¾é¡µæ£å¨å è½½æ¶ï¼Firefox å°æ¨è¿è§¦å setTimeout() 计æ¶å¨ãç´å°ä¸»çº¿ç¨è¢«è®¤ä¸ºæ¯ç©ºé²çï¼ç±»ä¼¼äº Window.requestIdleCallback()ï¼ï¼æè
ç´å°å è½½äºä»¶è§¦å宿¯ï¼æå¼å§è§¦åã
WebExtension èæ¯é¡µé¢å宿¶å¨
å¨ WebExtension ä¸ï¼setTimeout() ä¸ä¼å¯é å·¥ä½ãæ©å±å¼åè
åºå½ä½¿ç¨ alarms API ä½ä¸ºæ¿ä»£ã
æå¤§å»¶æ¶å¼
æµè§å¨å é¨ä»¥ 32 ä½å¸¦ç¬¦å·æ´æ°åå¨å»¶æ¶ãè¿å°±ä¼å¯¼è´å¦æä¸ä¸ªå»¶æ¶å¤§äº 2147483647 毫ç§ï¼å¤§çº¦ 24.8 å¤©ï¼æ¶å°±ä¼æº¢åºï¼å¯¼è´å®æ¶å¨å°ä¼è¢«ç«å³æ§è¡ã
setTimeout(() => console.log("ä½ å¥½ï¼"), 2 ** 32 - 5000);
导è´ç«å»æ§è¡è¶
æ¶ï¼å 为 2**32 - 5000 溢åºä¸ºè´æ°ï¼ï¼è以ä¸ä»£ç ï¼
setTimeout(() => console.log("hi!"), 2 ** 32 + 5000);
导è´å¤§çº¦å¨ 5 ç§åæ§è¡è¶ æ¶ã
夿³¨ï¼è¿ä¸ Node.js ä¸ setTimeout çè¡ä¸ºä¸ç¬¦ï¼Node.js ä¸ä»»ä½å¤§äº 2147483647 毫ç§çè¶
æ¶é½ä¼ç«å³æ§è¡ã
示ä¾
>设å®åæ¸ é¤è¶ æ¶
ä¸é¢çä¾åå¨ä¸ä¸ªç½é¡µä¸è®¾ç½®äºä¸¤ä¸ªç®åçæé®ï¼å¹¶å°å®ä»¬ä¸ setTimeout() å clearTimeout() ä¾ç¨æé©ãæä¸ç¬¬ä¸ä¸ªæé®å°è®¾ç½®ä¸ä¸ªè¶
æ¶ï¼å¨ä¸¤ç§åæ¾ç¤ºä¸æ¡ä¿¡æ¯ï¼å¹¶åå¨è¶
æ¶ ID ä¾ clearTimeout() 使ç¨ãä½ å¯ä»¥éæ©æç¬¬äºä¸ªæé®æ¥åæ¶è¿ä¸ªè¶
æ¶ã
HTML
<button onclick="delayedMessage();">å¨ä¸¤ç§åæ¾ç¤ºä¸æ¡æ¶æ¯</button>
<button onclick="clearMessage();">卿¾ç¤ºååæ¶è¿æ¡æ¶æ¯</button>
<div id="output"></div>
JavaScript
let timeoutID;
function setOutput(outputContent) {
document.querySelector("#output").textContent = outputContent;
}
function delayedMessage() {
setOutput("");
timeoutID = setTimeout(setOutput, 2 * 1000, "太æ
¢äºï¼");
}
function clearMessage() {
clearTimeout(timeoutID);
}
è¿è¡ç»æ
åè§ clearTimeout() ç示ä¾ã
è§è
| è§è |
|---|
| HTML > # dom-settimeout-dev > |