不使用内置方法call,apply,bind改变this指向

改变this指向的原理要用到我们的第三种定义函数的方式:
var Fn=new Function()
函数由Function构造器实例化这句话怎么去理解:
首先举个例子:

var name = new Function()
   console.log(name)

输出的形式就是(也可以去传递参数):
在这里插入图片描述
而且new Function就会是一个构造函数,这时候new Function()中的this指向就会是name,又因为name是一个函数,所以说这个this就会指向name的这个函数。这时候我们去看一下不使用内置方法call怎样去改变this指向:

   Function.prototype.call2 = function (con) {
      var ct = con || window
      console.log(this)
      //这里的this就会是我们底下的get函数,也就验证了我们刚才说的this会指向他的一个new实例,就会指向这个函数,
      // 给obj上面添加fn
      ct.fn = this
      //进行拼接
      var args = []
      for (var i = 1; i< arguments.length; i++) {
         args.push('arguments[' + i + ']');
      }
      var res = eval('ct.fn(' + args + ')')        // 执行对象上的函数   eval会将不执行的代码转换为想让他执行的样子
        // 最后删除掉这个函数
      delete ct.fn
      //最后必须return
      return res
   }
   var msg = "react"
   var obj = {
      msg: 'vue'
   }
   
   function get(v) {
      console.log(this) //指向的是window
      console.log(v)
      return this.msg //找的就会是全局的msg
   }
   var res = get.call2(obj, 'ncjdncjd') //这里进行传参
   console.log(res)

猜你喜欢

转载自blog.csdn.net/weixin_47459930/article/details/106502246