call 、apply 、bind 可用于更改函数中的this,这三个函数的第一个参数都是 this 的指向对象
call、apply会立即执行原函数,返回值的逻辑和原函数相同
bind不会执行原函数,返回的是this变更过后的函数
// 接受一个引用类型数据obj作为this参数
Function.prototype.myCall = function (obj, ...arguments) {
// 原生如果接收到的this参数是undefined或null,this则改为window,其他简单数据类型则包装成对象,这里统一window
if (typeof obj !== "object") obj = window
obj.tempCall = this // 改变this指向
const ret = obj.tempCall(...arguments) // 剩余参数
delete obj.tempCall
return ret
}
// 接受一个引用类型数据obj作为this参数
Function.prototype.myApply = function (obj, argArr) {
// 原生如果接收到的this参数是undefined或null,this则改为window,其他简单数据类型则包装成对象,这里统一window
if (typeof obj !== "object") obj = window
obj.tempCall = this // 改变this指向
const ret = obj.tempCall(...argArr)
delete obj.tempCall
return ret
}
// 接受一个引用类型数据obj作为this参数
Function.prototype.myBind = function (obj, ...arg1) {
// 原生如果接收到的this参数是undefined或null,this则改为window,其他简单数据类型则包装成对象,这里统一window
if (typeof obj !== "object") obj = window
tempCall = this // 改变this指向
return function (...arg2) {
return tempCall.myCall(obj, ...arg1, ...arg2) // 剩余参数
}
}