JavaScript教程筆記(16)-定時器
阿新 • • 發佈:2019-01-03
JavaScript中定時執行程式碼的功能,叫做定時器(timer),主要由setTimeout和setInterval兩個函式完成。
1 setTimeout()
setTimeout函式用來指定某個函式或某段程式碼,在多少毫秒後執行。返回值是一個整數,表示定時器的ID,以後用來取消這個定時器。
var timerId = setTimeout(func|code, delay);
上面程式碼中,setTimeout接受兩個引數。第一個引數func|code是函式名或一段程式碼,第二個引數delay代表在多少毫秒後執行。
console.log(1); setTimeout('console.log(2)', 1000); console.log(3); // 1 // 3 // 2
上面程式碼中,第一個引數是一段程式碼,注意:console.log(2)必須是字串的形式。結果是先輸出1和3,然後等待1000毫秒輸出2。
function f() {
console.log(1);
}
setTimeout(f, 1000);
上面程式碼中,setTimeout的第一個引數直接是一個函式名。
setTimeout的第二個引數預設為0,可以省略。
setTimeout(f);
// 等同於
setTimeout(f, 0);
setTimeout還允許更多的引數,將被依次傳入推遲執行的函式。
setTimeout(function(a,b) { console.log(a + b); }, 1000, 1, 2); // 3
注意,如果setTimeout的回撥函式是物件的方法,那麼方法內部的this關鍵字指向全域性環境,而不是方法所在的物件。
var x = 1;
var obj = {
x: 2,
y: function() {
console.log(this.x);
}
};
setTimeout(obj.y, 1000) // 1
上面程式碼輸出的是1,而不是2。原因是當obj在1000毫秒後執行時,this所指向的不是obj,而是全域性環境。
為防止出現這種問題,一種方法是將obj.y放入一個函式。
var x = 1; var obj = { x: 2, y: function() { console.log(this.x); } }; setTimeout(function() { obj.y(); , 1000); // 2
上面程式碼中,obj.y放在一個匿名函式中執行,使得obj.y在obj的作用域內執行,而不是全域性環境,所以顯示正確的值2。
另一種方法是使用bind。
var x = 1;
var obj = {
x: 2,
y: function() {
console.log(this.x);
}
};
setTimeout(obj.y.bind(obj), 1000);
// 2
上面程式碼中,將obj.y這個方法繫結在obj物件。
注:本文適用於ES5規範,原始內容來自 JavaScript 教程,有修改。