美文网首页
手写apply方法

手写apply方法

作者: 转移到CSDN名字丹丹的小跟班 | 来源:发表于2021-03-07 23:00 被阅读0次
    Function.prototype.apply = function (...arg) {
      let context = arg[0]
      // 因为apply的传参为一个数组,所以...arg接收参数后,arg格式为[context, [params]]
      let args = arg[1]
      if(Object.prototype.toString.call(args) !== "[object Array]") {
        console.error('参数应该为一个数组')
        return
      }
    //判断this指向的是否为对象,不是则让他为window或指向一个空对象
      if(typeof context === 'object') {
        context = context || window
      }else {
        context = Object.create(null)
      }
    //创建一个不会重复键名
      let fn = new Date().getTime() + '' + Math.random()
    //键名的值为this这个函数
      context[fn] = this
    //直接执行函数,此时this指向context
      let result = context[fn](...args)
      delete context[fn]
      return result
    }
    
    function aa(a,b) {
      console.log(this.x,a,b);
    }
    let obj = {x: 100}
    aa.apply(obj, [10,100])  // 100,10,100
    

    相关文章

      网友评论

          本文标题:手写apply方法

          本文链接:https://www.haomeiwen.com/subject/xyrkqltx.html