注意,这里只是去演示原理,实际上,这个call方法内部实现方式可能会有细微差别,但原理就是这个样子。
// 直接在Function的原型上添加
Function.prototype.callfunc = function (context) {
// 按照js函数接收参数的规则,这个context就是第一个传入的参数
// 也就是传入的要作为this 的对象 不传入,就是window
var content = context || window
// 在这里,应用this规则中的谁调用的这个函数,this就指向谁的原则,
// 那个函数调用call方法,这个this就是哪个函数
content.fn = this
// 接下来,拿到所有传入的从第二个参数开始的参数 因为第一个参数是修改后的this
var args = [...arguments].slice(1)
// 在这里,是重点,content是第一个参数,也就是指定的this,
// 通过这个this去执行fn,fn就是当成执行call方法的函数,以此实现了改变this
var result = content.fn(...args)
// 最后清空这个对象的引用,释放内存
content = null
return result
}
// 做个小实验
let obj = {
name: 'aaa'
}
function showData(age) {
console.log(this.name)
console.log(age);
}
showData.call(obj,13)
showData.callfunc(obj,13)
// 果然结果一样