call , apply的this指向实现原理并自己实现封装

实现this指向原理
var value = 'value' var obj = { value: 'obj' } function func() { console.log(this.value) } func() // obj func.call(obj) // obj obj.func = func // 相当于obj变成了 obj = { value: 'obj', func: function func() {console.log(this.value)}} --创建后记得删除 obj.func() // obj 相当于调用obj内的func函数

实现this指向并传参原理

// 将newCall赋到Function的父对象上
     Function.prototype.newCall = function () {
          var ctx = arguments[0] || window // 判断是否传了一个对象进来,如果有将this指向这个对象
          ctx.fn = this
          var args = []
          for(var i = 1; i<arguments.length; i++) {
            args.push('arguments[' + i + ']')
          }
          // args = ['arguments[i]','arguments[2]'].join(',')
          // eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。缺点是会改变作用域
          var result = eval('ctx.fn(' + args.join(',') + ')') 
          delete ctx.fn // 删除在ctx对象内创建的fn函数
          return result
        }
posted @ 2019-11-29 13:04  林中有风  阅读(278)  评论(0编辑  收藏  举报