JavaScript setTimeout()

admin發表於2018-08-20

setTimeout是JavaScript中定時器方法之一,另一個定時器方法是setInterval

由於使用頻繁,它的重要性毋庸置疑,網上關於它的文章更是多如牛毛。

其中不乏優秀的文章,大多數文章存在一個問題,那就是重複度太高,只介紹最為基礎的東西,很多重要的特性都沒有涉及,本文將通過程式碼例項詳細介紹一下setTimeout方法的用法。

此方法可以延遲指定時間再去執行規定的程式碼。

語法結構:

[JavaScript] 純文字檢視 複製程式碼
setTimeout(code,interval)

引數解析:

(1).code:必需,延遲指定時間後要執行的程式碼。

(2).interval:必需,規定要延遲的時間,單位是毫秒。

ES5中,還可以傳遞第三個引數,現在不做介紹,文章後面會有專門的例項程式碼演示。

可以使用clearTimeout方法終止setTimeout方法的執行。

更多關於window物件內容參閱JavaScript window 物件一章節。

瀏覽器支援:

(1).IE瀏覽器支援此方法。

(2).edge瀏覽器支援此方法。

(3).谷歌瀏覽器支援此方法。

(4).opera瀏覽器支援此方法。

(5).火狐瀏覽器支援此方法。

(6).safria瀏覽器支援此方法。

特別說明:IE9+與其他標準瀏覽器支援傳遞第三個引數。

程式碼例項如下:

[HTML] 純文字檢視 複製程式碼執行程式碼
<!DOCTYPE html>
<html>
<head>
<meta charset="">
<meta name="author" content="http://www.softwhy.com/" />
<title>螞蟻部落</title>
<script>
function setStyle() {
  var odiv = document.getElementById("ant");
  odiv.style.color="red";
  odiv.style.backgroundColor="#ccc";
  odiv.style.textAlign="center";
  odiv.style.lineHeight="40px";
}
setTimeout(setStyle,2000)
</script>
</head>
<body>
<div id="ant">螞蟻部落</div>
</body>
</html>

上面的程式碼會在2秒之後設定div元素的相關樣式。

setTimeout第一個引數除了是回撥函式(推薦使用)也可以是字串。

程式碼例項如下:

[HTML] 純文字檢視 複製程式碼執行程式碼
<!DOCTYPE html>
<html>
<head>
<meta charset="">
<meta name="author" content="http://www.softwhy.com/" />
<title>螞蟻部落</title>
<script>
function setStyle() {
  var odiv = document.getElementById("ant");
  odiv.style.color="red";
  odiv.style.backgroundColor="#ccc";
  odiv.style.textAlign="center";
  odiv.style.lineHeight="40px";
}
setTimeout("setStyle()",2000)
</script>
</head>
<body>
<div id="ant">螞蟻部落</div>
</body>
</html>

此時它對字串引數的處理方式類似於eval()方法;不推薦使用此方式。

並且setTimeout方法會在全域性作用域查詢通過字串傳遞的函式。

看如下程式碼例項:

[HTML] 純文字檢視 複製程式碼執行程式碼
<!DOCTYPE html>
<html>
<head>
<meta charset="">
<meta name="author" content="http://www.softwhy.com/" />
<title>螞蟻部落</title>
<script>
window.onload=function(){
  function setStyle() {
    var odiv = document.getElementById("ant");
    odiv.style.color="red";
    odiv.style.backgroundColor="#ccc";
    odiv.style.textAlign="center";
    odiv.style.lineHeight="40px";
  }
  setTimeout("setStyle()",2000)
}
</script>
</head>
<body>
<div id="ant">螞蟻部落</div>
</body>
</html>

上面的程式碼會報錯,谷歌控制檯執行截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201808/22/091604lb411xa5q44q5co8.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

因為這個時候setTimeout會在全域性作用域查詢setStyle函式,然而它是宣告在函式作用域中。

傳遞第三個引數:

setTimeout方法還可以接收第三個引數,此引數會被傳遞給被呼叫的回撥函式。

這是ES5新增的語法結構,低版本的IE瀏覽器並不支援。

[HTML] 純文字檢視 複製程式碼執行程式碼
<!DOCTYPE html>
<html>
<head>
<meta charset="">
<meta name="author" content="http://www.softwhy.com/" />
<title>螞蟻部落</title>
<script>
function setStyle() {
  var odiv = document.getElementById("ant");
  odiv.style.color=styleObj.color;
  odiv.style.backgroundColor=styleObj.bgColor;
  odiv.style.textAlign=styleObj.textAlign;
  odiv.style.lineHeight=styleObj.lineHeight;
}
let styleObj={
    color:"red",
    bgColor:"#ccc",
    textAlign:"center",
    lineHeight:"40px"
}
setTimeout(setStyle,2000,styleObj)
</script>
</head>
<body>
<div id="ant">螞蟻部落</div>
</body>
</html>

第三個引數會被作為setStyle函式的引數傳遞;為了相容所有瀏覽器可以採用如下兩種方式。

程式碼例項一:

[HTML] 純文字檢視 複製程式碼執行程式碼
<!DOCTYPE html>
<html>
<head>
<meta charset="">
<meta name="author" content="http://www.softwhy.com/" />
<title>螞蟻部落</title>
<script>
function setStyle() {
  var odiv = document.getElementById("ant");
  odiv.style.color=styleObj.color;
  odiv.style.backgroundColor=styleObj.bgColor;
  odiv.style.textAlign=styleObj.textAlign;
  odiv.style.lineHeight=styleObj.lineHeight;
}
let styleObj={
    color:"red",
    bgColor:"#ccc",
    textAlign:"center",
    lineHeight:"40px"
}
setTimeout("setStyle(styleObj)",2000)
</script>
</head>
<body>
<div id="ant">螞蟻部落</div>
</body>
</html>

回撥函式以字串方式使用,可以直接傳遞引數,不過不推薦使用。

程式碼例項二:

[HTML] 純文字檢視 複製程式碼執行程式碼
<!DOCTYPE html>
<html>
<head>
<meta charset="">
<meta name="author" content="http://www.softwhy.com/" />
<title>螞蟻部落</title>
<script>
let styleObj={
    color:"red",
    bgColor:"#ccc",
    textAlign:"center",
    lineHeight:"40px"
}
setTimeout((function(styleObj){
  return function setStyle() {
    var odiv = document.getElementById("ant");
    odiv.style.color=styleObj.color;
    odiv.style.backgroundColor=styleObj.bgColor;
    odiv.style.textAlign=styleObj.textAlign;
    odiv.style.lineHeight=styleObj.lineHeight;
  }
})(styleObj),2000)
</script>
</head>
<body>
<div id="ant">螞蟻部落</div>
</body>
</html>

採用閉包的方式巧妙的實現了引數的傳遞。

說實話,以當前的軟硬體發展速度,基本可以不用考慮低版本IE瀏覽器。

相關文章