调用 call 所传递的第一个参数表示的是: 函数执行时的 this 指向.
同时, 后续传入的参数是函数原本执行时就所需的参数
根据这两个需求, 我们可以写出如下代码
Function.prototype.call = Function.prototype.call || function(new_this) {
const arg = []
for (let i = 1; i < arguments.length; i ++) {
arg.push(arguments[i])
}
new_this.fn = this
const result = new_this.fn(...arg)
delete new_this.fn
return result
}
1. call 的模拟实现
1.1 call 的初步实现
调用 call 所传递的第一个参数表示的是: 函数执行时的 this 指向. 同时, 后续传入的参数是函数原本执行时就所需的参数 根据这两个需求, 我们可以写出如下代码
1.2 call 的进一步实现
当调用 call 所传递的第一个参数是 null 或 undefined 时, 函数的 this 指向为 window 若传入的第一个参数是基础类型, 则会在函数中转化为引用类型
2. apply 的模拟实现
2.1 apply 的初步模拟
2.2 apply 的进一步模拟
当调用 apply 所传递的第一个参数是 null 或 undefined 时, 函数的 this 指向为 window 若传入的第一个参数是基础类型, 则会在函数中转化为引用类型