每个函数实例都有call,apply属性
时间: 2024-04-20 09:26:52 浏览: 17
这个说法是不正确的。虽然函数对象具有`call`和`apply`方法,但是并不是每个函数实例都有`call`和`apply`属性。只有函数对象才有`call`和`apply`方法,这两个方法用于调用函数并指定函数内部`this`的指向。如果你尝试在一个非函数对象上使用`call`或`apply`属性,会抛出一个`TypeError`错误。
相关问题
call apply bind 有什么区别
`call()`、`apply()` 和 `bind()` 都是 JavaScript 中用来改变函数执行上下文的方法,它们之间的区别如下:
1. `call()` 和 `apply()` 都可以用来改变函数的执行上下文(即 `this` 指向),并立即执行该函数。它们的语法略有不同,`call()` 接受的参数是一个个单独的参数,而 `apply()` 接受的参数是一个数组。例如:
```javascript
function add(a, b) {
return a + b + this.c;
}
const obj = { c: 3 };
add.call(obj, 1, 2); // 6
add.apply(obj, [1, 2]); // 6
```
2. `bind()` 方法与 `call()` 和 `apply()` 的区别在于它不会立即执行函数,而是返回一个新的函数,该函数的 `this` 指向绑定的对象。例如:
```javascript
function add(a, b) {
return a + b + this.c;
}
const obj1 = { c: 3 };
const obj2 = { c: 5 };
const add1 = add.bind(obj1, 1, 2);
const add2 = add.bind(obj2, 1);
add1(); // 6
add2(2); // 8
```
在上面的示例中,我们使用 `bind()` 方法将 `add()` 函数绑定到两个不同的对象上,并将参数部分绑定为 `1` 和 `1, 2`,然后分别创建了两个新的函数 `add1()` 和 `add2()`。当我们调用这两个新函数时,它们的 `this` 指向分别为 `obj1` 和 `obj2`,并且它们的参数部分已经被绑定。
总的来说,`call()` 和 `apply()` 可以用于立即调用函数并改变执行上下文,而 `bind()` 则用于创建一个新的函数并绑定执行上下文,以便稍后调用。
call和apply都是修改this指向的吗
是的,call和apply都是用来显式地指定函数内部的this对象。它们可以在调用函数时,将第一个参数作为this对象,并且传递其他参数作为函数的参数。区别在于传递参数的方式不同,call使用参数列表,而apply使用数组。例如:
```
function greeting(name) {
console.log(`Hello ${name}, my name is ${this.name}`);
}
const person1 = { name: 'Alice' };
const person2 = { name: 'Bob' };
greeting.call(person1, 'John'); // output: Hello John, my name is Alice
greeting.apply(person2, ['Mary']); // output: Hello Mary, my name is Bob
```
在这个例子中,我们使用call和apply来将函数greeting的this指向不同的对象,并传递参数。