函数除了传参,还有一个调用上下文this,使用call、apply 、bind可以改变函数的this
在实际开发中,选择使用 call
、apply
还是 bind
取决于你的具体需求和场景。以下是一些使用这些函数的常见情况:
1. 使用 call
的情况:
- 当你需要调用一个函数,并且需要明确指定
this
的上下文,同时参数已知且数量确定。 - 当你想要调用一个函数,并且希望按照顺序传递参数。
示例:调用一个构造函数,同时指定 this
的上下文。
function Person(name,work) {
this.name = name;
this.work =work;
const obj= this;
console.log({
obj})
}
const alice = Person.call({
age: 25 }, 'Alice','coder'); // 使用call指定this上下文和参数
2. 使用 apply
的情况:
- 当你有一个参数数组,并且想要将这个数组中的元素作为参数传递给一个函数。
- 当你需要调用一个函数,但是参数数量不确定或者参数存储在数组中。
示例:使用 Math.max
函数找出数组中的最大值。
const fruits = {
max:undefined
}
const numbers = [5, 8, 10, 3, 6];
function findMax(numbers) {
this.max=Math.max(numbers);
const obj= this;
console.log({
obj})
return this.max
}
const maxNumber = findMax.apply(fruits, numbers,[90]);
console.log(maxNumber,fruits)
3. 使用 bind
的情况:
- 当你需要创建一个新的函数,并且想要预先绑定
this
的上下文,同时保留参数的灵活性。 - 当你想要延迟执行函数,或者将函数作为回调传递给其他函数,同时保持特定的
this
上下文。 - 当你想要实现函数柯里化(curry)或部分应用(partial app