bind() 方法返回一个新函数,其 this 已设置为另一个对象。
与 apply() 和 call() 不同,bind() 不会立即执行函数。相反,它返回一个新版本的函数,其 this 被设置为另一个值。
让我们看一个例子:
let person = {
name: 'John',
getName: function() {
console.log(this.name);
}
};
window.setTimeout(person.getName, 1000);
这不会打印名称“John”,而是打印 undefined。要理解为什么会发生这种情况,请以等效的方式重写最后一行:
let func = person.getName;
setTimeout(func, 1000);
setTimeout() 与 person 对象分开接收函数,但没有 person 的名字。因此,当 setTimeout() 调用 person.getName 时,名称是未定义的。
要解决此问题,你需要将 getName() 方法绑定到 person 对象:
let func = person.getName.bind(person);
输出:
John
让我们检查一下这种方法是如何工作的:
person.getName 方法绑定到 person 对象。
绑定函数 func 现在将此值设置为 person 对象。当你将这个新绑定函数传递给 setTimeout() 函数时,它知道如何获取此人的姓名。
bind() 方法返回一个新函数,其 this 已设置为另一个对象。
与 apply() 和 call() 不同,bind() 不会立即执行函数。相反,它返回一个新版本的函数,其 this 被设置为另一个值。
让我们看一个例子:
let person = {
name: 'John',
getName: function() {
console.log(this.name);
}
};
window.setTimeout(person.getName, 1000);
这不会打印名称“John”,而是打印 undefined。要理解为什么会发生这种情况,请以等效的方式重写最后一行:
let func = person.getName;
setTimeout(func, 1000);
setTimeout() 与 person 对象分开接收函数,但没有 person 的名字。因此,当 setTimeout() 调用 person.getName 时,名称是未定义的。
要解决此问题,你需要将 getName() 方法绑定到 person 对象:
let func = person.getName.bind(person);
setTimeout(func, 1000);
输出:
John
让我们检查一下这种方法是如何工作的:
person.getName 方法绑定到 person 对象。
绑定函数 func 现在将此值设置为 person 对象。当你将这个新绑定函数传递给 setTimeout() 函数时,它知道如何获取此人的姓名。