1. 程式人生 > >JavaScript教程筆記(16)-定時器

JavaScript教程筆記(16)-定時器

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 教程,有修改。