关于call,apply,bind方法,下列说法正确的是
时间: 2023-03-19 19:29:15 浏览: 137
1. call、apply、bind都是用来改变函数执行时的this指向的方法,可以让函数在不同的上下文中执行。
2. call和apply的作用相同,都是立即调用函数并改变函数的this指向,区别在于传参方式不同,call是一个一个传参,apply是以数组的形式传参。
3. bind方法不会立即调用函数,而是返回一个新的函数,新函数的this指向被绑定的对象,可以在需要的时候调用。
4. call、apply、bind都是函数对象的方法,只能被函数调用,不能被其他类型的对象调用。
5. call、apply、bind方法的第一个参数都是要绑定的this对象,如果不传参数或传null或undefined,则默认绑定全局对象window。
6. call、apply、bind方法的第二个参数开始是函数的实参,如果不传参数,则函数不会接收任何实参。
相关问题
重构call apply bind方法
以下是重构call、apply、bind方法的示例:
1. 重构call方法:
```javascript
Function.prototype.myCall = function(context, ...args) {
context = context || window;
const fn = Symbol();
context[fn] = this;
const result = context[fn](...args);
delete context[fn];
return result;
};
// 示例
function greet(name) {
console.log(`Hello, ${name}!`);
}
const person = {
name: 'Alice'
};
greet.myCall(person, 'Bob'); // 输出:Hello, Bob!
```
2. 重构apply方法:
```javascript
Function.prototype.myApply = function(context, args) {
context = context || window;
const fn = Symbol();
context[fn] = this;
const result = context[fn](...args);
delete context[fn];
return result;
};
// 示例
function greet(name) {
console.log(`Hello, ${name}!`);
}
const person = {
name: 'Alice'
};
greet.myApply(person, ['Bob']); // 输出:Hello, Bob!
```
3. 重构bind方法:
```javascript
Function.prototype.myBind = function(context, ...args) {
const fn = this;
return function(...innerArgs) {
return fn.apply(context, [...args, ...innerArgs]);
};
};
// 示例
function greet(name) {
console.log(`Hello, ${name}!`);
}
const person = {
name: 'Alice'
};
const greetPerson = greet.myBind(person);
greetPerson('Bob'); // 输出:Hello, Bob!
```
手写call apply bind方法
手写call方法:
```
Function.prototype.myCall = function(context) {
context = context || window;
context.fn = this;
var args = [...arguments].slice(1);
var result = context.fn(...args);
delete context.fn;
return result;
}
```
手写apply方法:
```
Function.prototype.myApply = function(context, arr) {
context = context || window;
context.fn = this;
var result;
if (!arr) {
result = context.fn();
} else {
result = context.fn(...arr);
}
delete context.fn;
return result;
}
```
手写bind方法:
```
Function.prototype.myBind = function(context) {
var self = this;
var args = [...arguments].slice(1);
return function() {
var bindArgs = [...arguments];
return self.apply(context, args.concat(bindArgs));
}
}
```
这些代码中的"context"是指调用这个方法时传入的对象, "args" 是传入的参数, 它们都是可选的.