手写call、apply、bind
时间: 2024-10-18 16:09:59 浏览: 32
在JavaScript中,`call()`, `apply()`, 和 `bind()` 都是函数的方法,用于改变函数的行为,以便它们可以作用于不同的上下文或者接收不同的实参。以下是这三个方法的简要介绍:
1. **call()**: 这个方法允许你调用一个函数,并传入指定的对象作为上下文(`this` 关键字指向的对象),以及额外的参数列表。语法如下:
```javascript
function targetFunction() {
this.someProperty = 'called from call';
}
let obj = { someProperty: 'original' };
targetFunction.call(obj);
```
在这个例子中,`targetFunction` 的 `this` 就会绑定到 `obj` 对象上。
2. **apply()**: 类似于 `call()`, 但它接受的是一个数组作为参数列表,而不是分开的参数。这样可以更方便地传递多个参数,语法如下:
```javascript
let args = [42, 'hello'];
targetFunction.apply(obj, args); // 相当于 targetFunction.call(obj, 42, 'hello');
```
3. **bind()**: 这个方法返回一个新的函数,该新函数有自己的 `this` 指向,同时可以预先设置一些默认参数。当你需要创建一个总是拥有特定上下文的新函数时,非常有用:
```javascript
let boundFunc = targetFunction.bind(obj);
boundFunc(); // 等同于 targetFunction.call(obj);
```
使用 `boundFunc` 调用时,其内部的 `this` 已经固定为 `obj`。
阅读全文