改变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)