手写call apply 2行

 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                  // 返回函数执行结果
}
发布了235 篇原创文章 · 获赞 88 · 访问量 44万+

猜你喜欢

转载自blog.csdn.net/qq_34629352/article/details/105458129