如何改变函数内部的 this 指针的指向?
题干
- 改变函数内部的 this 指向
题解
JS 中的函数对象提供了 call() 和 apply() 方法,它们可以显式地指定函数执行时的 this 值。
- 使用
call()方法
call() 方法接受一个对象作为参数,将该对象作为函数执行时的 this 值。可以在 call() 方法后面传入其他参数作为函数的参数。
🌰:
javascript
function sayHello() {
console.log(`Hello, ${this.name}!`);
}
const obj = {
name: 'Alice'
};
sayHello.call(obj); // 输出:Hello, Alice!- 使用
apply()方法
apply() 方法与 call() 方法类似,但它接受一个数组作为参数,数组中的元素将作为函数的参数传递进去。
🌰:
javascript
function sayHello(city) {
console.log(`Hello, ${this.name} from ${city}!`);
}
const obj = {
name: 'Alice'
};
sayHello.apply(obj, ['New York']); // 输出:Hello, Alice from New York!- 使用
bind()方法
bind() 方法创建一个新的函数,将其 this 值绑定到指定的对象上。与 call() 和 apply() 不同,bind() 方法不会立即执行函数,而是返回一个新函数,可以稍后调用。例如:
javascript
function sayHello() {
console.log(`Hello, ${this.name}!`);
}
const obj = {
name: 'Alice'
};
const boundFunction = sayHello.bind(obj);
boundFunction(); // 输出:Hello, Alice!在上例中,bind() 方法将 sayHello 函数的 this 值绑定到 obj 对象上,并返回一个新的函数 boundFunction。调用 boundFunction() 时,新函数的 this 值仍然指向 obj 对象。
- 使用箭头函数
箭头函数不具有自己的 this 值,而是继承外部作用域的 this 值。因此,可以通过定义箭头函数来改变函数内部的 this 指向。
🌰:
javascript
const obj = {
name: 'Alice',
sayHello: function() {
const arrowFunc = () => {
console.log(`Hello, ${this.name}!`);
};
arrowFunc();
}
};
obj.sayHello(); // 输出:Hello, Alice!在上例中,sayHello 方法内部定义了一个箭头函数 arrowFunc,它继承了外部作用域的 this 值,因此在箭头函数中的 this 指向 obj 对象。

