
setTimeout.jpg
今天跟大家分享一道有趣的題目,大家對定時器函數(shù)應(yīng)該都不陌生,但是在開始我們的問題之前,還是簡單介紹下這兩個方法。
一、定義和使用方法
定義:
setTimeout() :在指定的毫秒數(shù)后調(diào)用函數(shù)或計算表達(dá)式,只執(zhí)行一次。
setInterval() :按照指定的周期(以毫秒計)來調(diào)用函數(shù)或計算表達(dá)式。方法會不停地調(diào)用函數(shù),直到 clearInterval() 被調(diào)用或窗口被關(guān)閉。
使用方法:
setTimeout(code,millisec)
setInterval(code,millisec[,"lang"])
其中第一個參數(shù)可以是一個包含javascript代碼的字符串,也可以是一個函數(shù)
第二個參數(shù)是等待時間
e.g.
//不建議傳遞字符串
setTimeout(“alert(‘Hello world’)”, 1000);
//推薦的調(diào)用方式
setTimeout(function(){
Alert(“Hello world!")
},1000)
二、用setTimeout實現(xiàn)setInterval
下面我們就一起來實現(xiàn)這個有趣的問題
思路是使用遞歸函數(shù),不斷地去執(zhí)行setTimeout從而達(dá)到setInterval的效果,看代碼
function mySetInterval(fn, millisec){
function interval(){
setTimeout(interval, millisec);
fn();
}
setTimeout(interval, millisec)
}
這個mySetInterval函數(shù)有一個叫做interval的內(nèi)部函數(shù),它通過setTimeout來自動被調(diào)用,在interval中有一個閉包,調(diào)用了回調(diào)函數(shù)并通過setTimeout再次調(diào)用了interval。
三、一個更好的實現(xiàn)
我們再增加一個額外的參數(shù)用來標(biāo)明代碼執(zhí)行的次數(shù)
function mySetInterval(fn, millisec,count){
function interval(){
if(typeof count===‘undefined’||count-->0){
setTimeout(interval, millisec);
try{
fn()
}catch(e){
count = 0;
throw e.toString();
}
}
}
setTimeout(interval, millisec)
}
參考資料:
《Javascript高級程序設(shè)計》
利用setTimeout來實現(xiàn)setInterval
給我點贊的都是小可愛 ^_^