Phương thức setTimeout() đặt bộ hẹn giờ thực thi một chức năng hoặc đoạn mã nào đó sau khi thời gian đặt trước đã trôi qua.
setTimeout(code)
setTimeout(code, delay)
setTimeout(functionRef)
setTimeout(functionRef, delay)
setTimeout(functionRef, delay, param1)
setTimeout(functionRef, delay, param1, param2)
setTimeout(functionRef, delay, param1, param2, /* … ,*/ paramN)
Phương thức đơn giản này chỉ có chút rắc rối khi dùng từ khóa this
.
Nếu trong thân hàm functionRef như trên có chứa từ khóa this
thì tùy ngữ cảnh this
tham chiếu đến các đối tượng khác nhau.
myArray = ['one', 'two', three']
// this tham chiếu đến myArray
myArray.myMethod = function (sProperty) {
console.log(arguments.length > 0 ? this[sProperty] : this);
};
// this tham chiếu đến "[object Window]"
setTimeout(myArray.myMethod, 1.0*1000);
// this tham chiếu đến "undefined"
setTimeout(myArray.myMethod, 1.5*1000, '1');\
// error
setTimeout.call(myArray, myArray.myMethod, 2.0*1000);
setTimeout.call(myArray, myArray.myMethod, 2.5*1000, 2);
Hai cách tránh hiểu lầm:
1. Bọc phương thức trong hàm mới
// in ra "zero,one,two"
setTimeout(() => {myArray.myMethod()}, 2.0 * 1000);
// in ra "one"
setTimeout(() => {myArray.myMethod('1')}, 2.5 * 1000);
2. Hoặc dùng bind
để chỉ rõ this
tham chiếu đến đối tượng nào
const myBoundMethod = (function (sProperty) {
console.log(arguments.length > 0 ? this[sProperty] : this);
}).bind(myArray);
// hay dùng trực tiếp không qua bound method
setTimeout(myArray.myMethod.bind(myArray), 1.0*1000);
// gọi phương thức trong class
setTimeout(this.myMethod.bind(this), 1000);