Call原理比较简单,由于函数的this指向它的直接调用者,我们变更调用者即完成this指向的变更:
// 简单版
Function.prototype.myCall = function(thisArg, ...args) {
thisArg.fn = this // this指向调用call的对象,即我们要改变this指向的函数
return thisArg.fn(...args) // 执行函数并return其执行结果
}
// 完善版
Function.prototype.myCall = function(thisArg, ...args) {
const fn = Symbol('fn')
thisArg = thisArg || window
thisArg[fn] = this
const result = thisArg[fn](...args)
delete thisArg[fn]
return result
}
const obj = {
name: '写代码像周杰伦'
}
function foo() {
console.log(this.name)
}
foo.myCall(obj)
// 手写apply
Function.prototype.myApply = function(thisArg, args) {
const fn = Symbol('fn') // 声明一个独有的Symbol属性, 防止fn覆盖已有属性
thisArg = thisArg || window // 若没有传入this, 默认绑定window对象
thisArg[fn] = this // this指向调用call的对象,即我们要改变this指向的函数
const result = thisArg[fn](...args) // 执行当前函数
delete thisArg[fn] // 删除我们声明的fn属性
return result // 返回函数执行结果
}
手写call apply 2行
猜你喜欢
转载自blog.csdn.net/qq_34629352/article/details/105458129
今日推荐
周排行