基本概念
js 定時器有以下兩個方法:
- setInterval() :按照指定的週期(以毫秒計)來調用函數或計算表達式。方法會不停地調用函數,直到 clearInterval() 被調用或窗口被關閉。
- setTimeout() :在指定的毫秒數後調用函數或計算表達式。
setInterval()
語法
setInterval(code,millisec,lang)
參數 | 描述 |
---|---|
code | 必需。要調用的函數或要執行的代碼串。 |
millisec | 必須。週期性執行或調用 code 之間的時間間隔,以毫秒計。 |
lang | 可選。 JScript | VBScript | JavaScript |
以下實例在每 1000 毫秒執行 clock() 函數。實例中也包含了停止執行的按鈕:
<html>
<body>
<input type="text" id="clock" />
<script type="text/javascript">
var int=self.setInterval("clock()",1000);
function clock()
{
var d=new Date();
var t=d.toLocaleTimeString();
document.getElementById("clock").value=t;
}
</script>
<button οnclick="int=window.clearInterval(int)">停止</button>
</body>
</html>
setTimeout()
語法
setTimeout(code,millisec,lang)
參數 | 描述 |
---|---|
code | 必需。要調用的函數後要執行的 JavaScript 代碼串。 |
millisec | 必需。在執行代碼前需等待的毫秒數。 |
lang | 可選。腳本語言可以是:JScript | VBScript | JavaScript |
實例演示如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鳥教程(runoob.com)</title>
</head>
<body>
<p>點擊按鈕,在等待 3 秒後彈出 "Hello"。</p>
<button οnclick="myFunction()">點我</button>
<script>
function myFunction()
{
setTimeout(function(){alert("Hello")},3000);
}
</script>
</body>
</html>
常見問題
常見爲回調函數未定義
setTimeout方法是掛在window對象下的。《JavaScript高級程序設計》第二版中,寫到:“超時調用的代碼都是在全局作用域中執行的,因此函數中this的值在非嚴格模式下指向window對象,在嚴格模式下是undefined”。在這裏,我們只討論非嚴格模式。
//String Code function test (){ var a=1; setTimeout("a++",100);//a is not defined; } test(); //Lambda表達式 function test (){ var a=1; setTimeout(function(){ a++; console.log(a); //正常運行,卻打印出結果2; },100); } test();
第一種形式(String Code)的情況,定時器彙總調用的是全局變量a,而上下文中定義的變量是局部變量,所以會報錯;
第二種形式(函數形式)可以這麼理解:在這裏匿名函數的使用形成了一個閉包,從而能訪問到外層函數的局部變量。只是這種閉包,跟常見的閉包不同,因爲函數式放在setTimeout裏面。
參考文章
https://www.runoob.com/w3cnote/js-timer.html
https://blog.csdn.net/pingwei_deng/article/details/80654696
https://blog.csdn.net/weixin_42371145/article/details/96880629