javascript中经典的call 、apply、bind方法以及this指向详解
2024-01-31 14:03:49
javascript 中经典的call 、apply、bind方法以及this指向详解
一说到js中的call、apply、bind方法,就一定会和this联系起来,百分之九十以上的问题都是有关这三个函数方法中this的指向问题,在前端面试题中非常的常见,掌握了这三个方法的this指向问题,不仅可以在面试官前侃侃而谈,加深面试官对你的印象,而且可以提高我们js代码的质量和可读性。
call方法
call方法是用来改变一个函数的this指向的,它接受两个参数:第一个参数是this指向的目标对象,第二个参数及以后的参数是传递给函数的参数。
function person(name, age) {
console.log(this.name);
console.log(this.age);
console.log(name);
console.log(age);
}
var obj = {
name: 'John Doe',
age: 30
};
// 调用person函数,this指向obj对象
person.call(obj, 'Jane Doe', 25);
// 输出结果:
// John Doe
// 30
// Jane Doe
// 25
在上面的示例中,我们定义了一个person函数,它接受两个参数:name和age。然后,我们创建了一个obj对象,并将person函数应用于该对象。
在调用person函数时,我们使用call方法将this指向obj对象。这意味着,当person函数内部使用this时,它将指向obj对象。
apply方法
apply方法与call方法非常相似,但它接受两个参数:第一个参数是this指向的目标对象,第二个参数是一个数组,其中包含要传递给函数的参数。
function person(name, age) {
console.log(this.name);
console.log(this.age);
console.log(name);
console.log(age);
}
var obj = {
name: 'John Doe',
age: 30
};
// 调用person函数,this指向obj对象
person.apply(obj, ['Jane Doe', 25]);
// 输出结果:
// John Doe
// 30
// Jane Doe
// 25
在上面的示例中,我们使用apply方法将this指向obj对象。与call方法一样,当person函数内部使用this时,它将指向obj对象。
bind方法
bind方法与call和apply方法不同,它不立即调用函数,而是返回一个新的函数,该函数的this指向已被绑定到指定的this值。
function person(name, age) {
console.log(this.name);
console.log(this.age);
console.log(name);
console.log(age);
}
var obj = {
name: 'John Doe',
age: 30
};
// 创建一个新的函数,this指向obj对象
var newPerson = person.bind(obj);
// 调用newPerson函数,this指向obj对象
newPerson('Jane Doe', 25);
// 输出结果:
// John Doe
// 30
// Jane Doe
// 25
在上面的示例中,我们使用bind方法创建了一个新的函数newPerson,该函数的this指向已被绑定到obj对象。这意味着,当我们调用newPerson函数时,this将指向obj对象。
this指向的比较
下表总结了call、apply和bind方法在this指向方面的区别:
方法 | this指向 | 参数 |
---|---|---|
call | 目标对象 | 单独传递参数 |
apply | 目标对象 | 数组传递参数 |
bind | 目标对象 | 返回一个新的函数 |
何时使用call、apply和bind方法?
在以下情况下,可以使用call、apply和bind方法来改变this指向:
- 当你想要在一个对象上调用一个函数,但该函数不是该对象的方法时。
- 当你想要将一个函数的this指向绑定到一个特定的对象时。
- 当你想要创建一个新的函数,该函数的this指向已被绑定到一个特定的对象时。
总结
call、apply和bind方法是JavaScript中非常有用的工具,可以用来控制this的指向。通过理解这三个方法之间的区别,并掌握如何使用它们,你可以编写出更灵活、可重用的代码。