Function binding
setTimeout 跟物件方法一起使用 this 很容易不見
Losing “this”
// 遺失 this
let user = {
firstName: "John",
sayHi() {
alert(`Hello, ${this.firstName}!`);
}
};
setTimeout(user.sayHi, 1000); // Hello, undefined!Solution 1: a wrapper
// 用包裝函式可以解決
let user = {
firstName: "John",
sayHi() {
alert(`Hello, ${this.firstName}!`);
}
};
setTimeout(function() {
user.sayHi(); // Hello, John!
}, 1000);
// 簡短的寫法
setTimeout(() => user.sayHi(), 1000); // Hello, John!
// 如果 user 在呼叫前就被改變了會出現錯誤
let user = {
firstName: "John",
sayHi() {
alert(`Hello, ${this.firstName}!`);
}
};
setTimeout(() => user.sayHi(), 1000);
// ...within 1 second
user = { sayHi() { alert("Another user in setTimeout!"); } };
// Another user in setTimeout?!?Solution 2: bind
Last updated
Was this helpful?