JavaScript——定時器(setTimeout/setInterval)

基本概念 

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>

常見問題

 1、出現變量未定義(xxx is not defined) 

常見爲回調函數未定義

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

https://www.cnblogs.com/juneling/p/8946107.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章