call()和apply()的区别和作用
时间: 2024-03-24 11:36:13 浏览: 31
`call()`和`apply()`是JS中用于调用函数的方法,它们的作用是改变函数的this指向,并立即执行这个函数。
它们的区别在于传递参数的方式不同:
- `call()`方法传递参数的方式是多个参数逐一传入,用逗号分隔,例如:`func.call(thisObj, arg1, arg2, arg3...)`。
- `apply()`方法传递参数的方式是将参数作为一个数组传入,例如:`func.apply(thisObj, [arg1, arg2, arg3...])`。
除了传递参数的方式不同,它们的作用是相同的,即改变函数的this指向,并立即执行这个函数。通常用于实现继承、借用函数等场景。
例如,在下面的代码中,使用`call()`方法实现了一个继承的例子:
```javascript
function Animal(name) {
this.name = name;
}
function Cat(name) {
Animal.call(this, name);
}
var cat = new Cat('Tom');
console.log(cat.name); // Tom
```
在这个例子中,我们定义了一个Animal类和一个Cat类。Cat类继承自Animal类,使用`call()`方法将Animal类的this指向Cat类,并传入name参数,从而实现了继承。最后,创建Cat对象实例,输出name属性。
相关问题
call和apply的作用和区别
`call()` 和 `apply()` 都是 JavaScript 中用于调用函数的方法,它们的作用是改变函数运行时的 `this` 指向。
它们的区别在于传参的形式不同:
`call()` 方法的第一个参数是要绑定给函数的 `this` 值,后面的参数是传递给函数的参数,可以是一个列表,也可以是单个参数。
例如:
```javascript
function greet(name) {
console.log(`Hello, ${name}! My name is ${this.name}.`);
}
const person = { name: 'John' };
greet.call(person, 'Alice');
// Output: Hello, Alice! My name is John.
```
在这个例子中,我们使用 `call()` 方法将 `greet()` 函数中的 `this` 绑定到 `person` 对象,并传递了一个参数 `'Alice'`。
`apply()` 方法的第一个参数也是要绑定给函数的 `this` 值,但是后面的参数必须是一个数组或类数组对象。
例如:
```javascript
function sum(a, b, c) {
return a + b + c;
}
const numbers = [1, 2, 3];
const result = sum.apply(null, numbers);
console.log(result);
// Output: 6
```
在这个例子中,我们使用 `apply()` 方法将 `sum()` 函数中的 `this` 绑定到 `null`,并传递了一个数组 `[1, 2, 3]`。
总的来说,`call()` 和 `apply()` 的作用是相同的,区别在于传参的形式。在实际使用中,可以根据具体需要选择使用哪种方法。
call和apply区别
call和apply都是用来改变函数执行上下文(this)的方法,但它们的参数传递方式不同。
在使用call方法时,可以将一个对象指定为函数执行时的上下文,然后在这个上下文中调用函数,同时还可以传递多个参数。例如,假设有一个函数foo,我们可以通过如下代码调用foo,并将一个对象obj作为foo函数中的this对象。
```
foo.call(obj, arg1, arg2, ...);
```
而使用apply方法时,也可以将一个对象指定为函数执行上下文,然后在这个上下文中调用函数,但是参数需要被放在一个数组中传递,而不是逐一传递。例如,假设有一个函数foo,我们可以通过如下代码调用foo,并将一个数组args作为参数传递给它。
```
foo.apply(obj, [arg1, arg2, ...]);
```
因此,call和apply方法的不同点在于参数传递的方式。