Windowï¼setInterval() æ¹æ³
åºçº¿
广æ³å¯ç¨
*
èª 2015å¹´7æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
* æ¤ç¹æ§çæäºé¨åçæ¯æç¨åº¦å¯è½ææä¸åã
Window æ¥å£ç setInterval() æ¹æ³éå¤è°ç¨ä¸ä¸ªå½æ°ææ§è¡ä¸ä¸ªä»£ç çæ®µï¼å¨æ¯æ¬¡è°ç¨ä¹é´å
·æåºå®çæ¶é´é´éã
æ¤æ¹æ³è¿åä¸ä¸ªé´é IDï¼å
¶å¯ä¸å°æ è¯æ¶é´é´éï¼å æ¤ä½ å¯ä»¥ç¨åéè¿è°ç¨ clearInterval() æ¥ç§»é¤å®ã
è¯æ³
setInterval(code)
setInterval(code, delay)
setInterval(func)
setInterval(func, delay)
setInterval(func, delay, arg1)
setInterval(func, delay, arg1, arg2)
setInterval(func, delay, arg1, arg2, /* â¦, */ argN)
åæ°
func-
è¦æ¯é
delayæ¯«ç§æ§è¡ä¸æ¬¡ç彿°ãç¬¬ä¸æ¬¡æ§è¡åçå¨delay毫ç§ä¹åã code-
è¿ä¸ªå¯éçè¯æ³è®©ä½ å¯ä»¥ä¼ éä¸ä¸ªå符串æ¥ä»£æ¿å½æ°ï¼ä½ ä¼ éçå符串ä¼è¢«ç¼è¯ç¶åæ¯ç»è¿
delayæ¯«ç§æ§è¡ä¸æ¬¡ãè¿ä¸ªè¯æ³å 为ä¸eval()åå¨ç¸åçå®å ¨é£é©æä»¥ä¸æ¨è使ç¨ã delayå¯é-
计æ¶å¨æ¯æ¬¡æ§è¡æå®ç彿°å代ç çå»¶è¿æ¶é´ï¼ä»¥æ¯«ç§ââååä¹ä¸ç§ââ为åä½ï¼ãå¦ææªæå®ï¼åå ¶é»è®¤å¼ä¸º 0ãåè§ä¸æ¹çå»¶è¿éå¶ä»¥äºè§£è¯¦ç»ç
delayçåå¼èå´ã arg1ãâ¦â¦ãargNå¯é-
å½è®¡æ¶å¨ç»æçæ¶åï¼å°è¢«ä¼ éç» func 彿°çéå åæ°ã
è¿åå¼
è¿åå¼ intervalID æ¯ä¸ä¸ªéé¶æ°å¼ï¼ç¨æ¥æ è¯è°ç¨ setInterval() å建ç宿¶å¨ï¼è¿ä¸ªå¼å¯ä»¥ç¨æ¥ä¼ éç» clearInterval() æ¥æ¸
é¤å®æ¶å¨ã
å¼å¾æ³¨æçæ¯ï¼setInterval() å setTimeout() å
±äº«åä¸ä¸ª ID æ± ï¼å¹¶ä¸ clearInterval() å clearTimeout() 卿æ¯ä¸æ¯å¯äºæ¢ä½¿ç¨çãç¶èï¼ä¸ºäºæ¸
æ°å¯è§ï¼ä½ åºè¯¥å°è¯å§ç»å¹é
ï¼ä»¥é¿å
ç»´æ¤ä»£ç æ¶äº§çæ··æ·ã
夿³¨ï¼åæ° delay ä¼è¢«è½¬æ¢æä¸ä¸ªæç¬¦å· 32 使´æ°ãè¿å° delay éå¶å°äº 2147483647 毫ç§ï¼å¤§çº¦ 24.8 天ï¼ä»¥å
ï¼å 为å®å¨ IDL ä¸è¢«æå®ä¸ºä¸ä¸ªæç¬¦å·æ´æ°ã
示ä¾
>ä¾ 1ï¼åºæ¬è¯æ³
ä¸é¢ä¾åæ¼ç¤ºäº setInterval() çåºæ¬è¯æ³ã
var intervalID = setInterval(myCallback, 500, "åæ° 1", "åæ° 2");
function myCallback(a, b) {
// å¨è¿éç¼åä½ ç代ç
// åæ°å®å
¨æ¯å¯éçã
console.log(a);
console.log(b);
}
ä¾ 2ï¼ä¸¤ç§é¢è²ç忢
ä¸é¢çä¾å伿¯éä¸ç§å°±è°ç¨ä¸æ¬¡ flashtext() 彿°ï¼ç´è³ä½ æä¸åæ¢æé®ã
HTML
<div id="my_box">
<h3>ä½ å¥½ä¸ç</h3>
</div>
<button id="start">å¼å§</button>
<button id="stop">忢</button>
CSS
.go {
color: green;
}
.stop {
color: red;
}
JavaScript
// ç¨äºåå¨ intervalID çåé
let nIntervId;
function changeColor() {
// æ£æ¥æ¯å¦å·²ç»è®¾ç½®äºå®æ¶å¨
if (!nIntervId) {
nIntervId = setInterval(flashText, 1000);
}
}
function flashText() {
const oElem = document.getElementById("my_box");
oElem.className = oElem.className === "go" ? "stop" : "go";
}
function stopTextColor() {
clearInterval(nIntervId);
// éæ¾ intervalID
nIntervId = null;
}
document.getElementById("start").addEventListener("click", changeColor);
document.getElementById("stop").addEventListener("click", stopTextColor);
ç»æ
âthisâçé®é¢
å½ä½ å°ä¸ä¸ªæ¹æ³ä¼ éç» setInterval() æå
¶ä»å½æ°æ¶ï¼å®å¨è¢«è°ç¨æ¶ä¼ç»å®é误ç this å¼ãè¿ä¸ªé®é¢å¨ JavaScript åèè¿è¡äºè¯¦ç»è§£éã
è§£é
被 setInterval() è°ç¨ç代ç å¨ä¸è°ç¨å®ç彿°ä¸åçä¸ä¸æä¸è¿è¡ãå æ¤ï¼è¢«è°ç¨å½æ°ç this å
³é®åè¢«è®¾ç½®ä¸ºäº windowsï¼æ globalï¼å¯¹è±¡ï¼è䏿¯è°ç¨ setTimeout æ¶ç thisã请ç以ä¸ç示ä¾ï¼å®ä½¿ç¨ setTimeout() 代æ¿äº setInterval()ââä½ä¸¤ç§å®æ¶å¨é½å
·æè¿ä¸çé®é¢ï¼ï¼
const myArray = ["é¶", "ä¸", "äº"];
myArray.myMethod = function (sProperty) {
alert(arguments.length > 0 ? this[sProperty] : this);
};
myArray.myMethod(); // æå°âé¶ï¼ä¸ï¼äºâ
myArray.myMethod(1); // æå°âä¸â
setTimeout(myArray.myMethod, 1000); // å¨ 1 ç§åæå°â[object Window]â
setTimeout(myArray.myMethod, 1500, "1"); // å¨ 1.5 ç§åæå°âundefinedâ
// ä½¿ç¨ .call ä¼ éâthisâ对象ä¸èµ·ä½ç¨
// å 为è¿ä¼æ¹å setTimeout èªèº«å
é¨ç this å¼
// èæä»¬æ³è¦æ¹åçæ¯ myArray.myMethod å
é¨ç this å¼
// å®é
ä¸ï¼è¿ä¼å¯¼è´é误ï¼å 为 setTimeout ä»£ç ææ this æ¯ window 对象ï¼
setTimeout.call(myArray, myArray.myMethod, 2000); // é误ï¼âNS_ERROR_XPC_BAD_OP_ON_WN_PROTO: Illegal operation on WrappedNative prototype objectâ
setTimeout.call(myArray, myArray.myMethod, 2500, 2); // ç¸åçé误
å¦ä½ æè§ï¼å¨æ§ç JavaScript 䏿 æ³å° this å¯¹è±¡ä¼ éç»åè°å½æ°ã
ä¸ä¸ªå¯è½çè§£å³æ¹æ¡
ææç°ä»£ JavaScript è¿è¡æ¶ï¼æµè§å¨æå
¶ä»å°æ¹ï¼é½æ¯æç®å¤´å½æ°ï¼æºå¸¦è¯æ³ thisï¼ââå
许æä»¬å¨ myArray æ¹æ³å
ï¼ç¼å setInterval(() => this.myMethod())ã
å¦æä½ éè¦æ¯æ IE æµè§å¨ï¼è¯·ä½¿ç¨ Function.prototype.bind() æ¹æ³ï¼å®å
è®¸ä½ æå®è°ç¨ç»å®å½æ°æ¶ this çå¼ãè¿å¯ä»¥è®©ä½ é¿å
å 为ä¸ä¸æçä¸åè导è´è°ç¨ç彿°ç this ä¸æç¡®èåºç°çé®é¢ã
使ç¨è¯´æ
setInterval() 彿°é常ç¨äºä¸ºé夿§è¡ç彿°è®¾ç½®ä¸ä¸ªæ¶é´é´éï¼ä¾å¦ï¼å¨ç»ï¼ãä½ å¯ä»¥ä½¿ç¨ clearInterval() 忶宿¶å¨ã
å¦æä½ å¸æå¨æå®çå»¶è¿åï¼ä»
æ§è¡ä¸æ¬¡å½æ°ï¼è¯·ä½¿ç¨ setTimeout()ã
å»¶è¿éå¶
宿¶å¨æ¯å¯ä»¥åµå¥çï¼è¿æå³çï¼setInterval() çåè°ä¸å¯ä»¥åµå
¥å¯¹ setInterval() çè°ç¨ä»¥å建å¦ä¸ä¸ªå®æ¶å¨ï¼å³ä½¿ç¬¬ä¸ä¸ªå®æ¶å¨è¿å¨è¿è¡ã为äºåè½»è¿å¯¹æ§è½äº§ççæ½å¨å½±åï¼ä¸æ¦å®æ¶å¨åµå¥è¶
è¿ 5 屿·±åº¦ï¼æµè§å¨å°èªå¨å¼ºå¶è®¾ç½®å®æ¶å¨çæå°æ¶é´é´é为 4 毫ç§ã妿å°è¯å°æ·±å±åµå¥ä¸è°ç¨ setInterval() çå»¶è¿è®¾å®ä¸ºå°äº 4 毫ç§çå¼ï¼å
¶å°è¢«åºå®ä¸º 4 毫ç§ã
å¨æäºæ
åµä¸ï¼æµè§å¨å¯è½ä¼å¼ºå¶æ§è¡æ´ä¸¥æ ¼çæå°æ¶é´é´ééå¶ï¼å°½ç®¡è¿äºæ
嵿¯ä¸å¸¸è§çãå¦å¤ï¼è¯·æ³¨ææ¯æ¬¡è°ç¨åè°å½æ°ä¹é´ç»è¿çå®é
æ¶é´å¯è½ä¼æ¯ç»å®ç delay é¿ï¼æå
³ç示ä¾ï¼è¯·åè§å®é
å»¶æ¶æ¯è®¾å®å¼æ´ä¹
çåå ã
ç¡®ä¿æ§è¡æ¶é´çäºå®æ¶å¨æ¶é´é´é
å¦æä½ ç代ç é»è¾æ§è¡æ¶é´å¯è½æ¯å®æ¶å¨æ¶é´é´éè¦é¿ï¼å»ºè®®ä½ 使ç¨éå½è°ç¨äº setTimeout() çå
·å彿°ãä¾å¦ï¼ä½¿ç¨ setInterval() 以 5 ç§çé´é轮询æå¡å¨ï¼å¯è½å ç½ç»å»¶è¿ãæå¡å¨æ ååºä»¥å许å¤å
¶ä»çé®é¢è导è´è¯·æ±æ æ³å¨åé
çæ¶é´å
宿ãå æ¤ï¼ä½ å¯è½ä¼åç°æéç XHR è¯·æ±æ²¡ææé¡ºåºè¿åã
å¨è¿äºåºæ¯ä¸ï¼åºé¦ééå½è°ç¨ setTimeout() çæ¨¡å¼ï¼
(function loop() {
setTimeout(function () {
// å¨è¿éç¼å代ç é»è¾
loop();
}, delay);
})();
å¨ä¸é¢ç代ç çæ®µä¸ï¼å£°æäºä¸ä¸ªå
·å彿° loop()ï¼å¹¶è¢«ç«å³æ§è¡ãloop() å¨å®æä»£ç é»è¾çæ§è¡åï¼ä¼å¨å
é¨éå½è°ç¨ setTimeout()ãè½ç¶è¯¥æ¨¡å¼ä¸ä¿è¯ä»¥åºå®çæ¶é´é´éæ§è¡ï¼ä½å®ä¿è¯äºä¸ä¸æ¬¡å®æ¶ä»»å¡å¨éå½åå·²ç»å®æã
è§è
| è§è |
|---|
| HTML > # dom-setinterval-dev > |