一、call、apply、bind的作用都是改变函数的this指向
call、apply在改变this指向的同时,也会把目标函数给执行掉。
bind只负责改造this,不执行任何操作。
二、模式实现一个call、apply、bind方法
Function.prototype.myCall = function (context, ...args) {
// step1: 把函数挂到目标对象上(这里的this就是我们要改造的那个函数)
context.fn = this;
// step2: 执行函数
context.fn(...args);
// step3: 删除step1中挂到目标对象上的函数
delete context.fn;
};
Function.prototype.myApply = function (context, args) {
// step1: 把函数挂到目标对象上(这里的this就是我们要改造的那个函数)
context.fn = this;
// step2: 执行函数
context.fn(args);
// step3: 删除step1中挂到目标对象上的函数
delete context.fn;
};
Function.prototype.myBind = function (context, args) {
const fn = this;
return function () {
return fn.apply(context, args);
}
};
const obj = {
name: 'hello'
};
function fn(gender) {
console.log(`${this.name} ${gender}`)
}
fn.myCall(obj, '男');