1.首先 context 为可选参数,如果不传的话默认上下文为 window ;
2.接下来给 context 创建一个 fun 属性,并将值设置为需要调用的函数;
因为 call 可以传入多个参数作为调用函数的参数,所以需要将参数剥离出来;
然后调用函数并将对象上的函数删除。
3.下面就给大家展示call方法的实现过程,其实不难。
// this 为调用的函数
// context 是参数对象
// 在函数原型上定义自己的myCall方法
Function.prototype.myCall = function (context) {
// 判断调用它的是否为函数,不是的话就抛出错误
if (typeof this !== 'function') {
throw new TypeError('Error')
}
// 不传参默认为 window
context = context || window
// 新增 fun 属性,将值设置为需要调用的函数
context.fun = this
// 将 arguments 转化为数组将 call 的传参提取出来 [...arguments]
const args = Array.from(arguments).slice(1)
// 传参调用函数
const result = context.fun(...args)
// 删除函数
delete context.fun
// 返回执行结果
return result;
}
// 普通函数
function test(age) {
console.log(this.name + " " + age);
}
// 自定义对象
var obj = {
name: 'jack'
}
// 调用函数的 _Call 方法
test.myCall(obj, 11)