又是一年的金三银四,疯狂的手写剧情再度上演,接下来就让我们一起来实现下JavaScript里的call函数。
在实现手写call之前让我们先来梳理下call函数的使用场景。通常我们在使用call的时候,需要两个对象(所有的一切都是对象):
那我们在实现call函数的时候主要突破点就是能够获取到foo以及obj。那么接下来我们就带着这样的一个思路来实现call方法吧。
function jCall(thisArg,...args) {
// 传进来的是null和undefined时将this指向为window
thisArg = thisArg ?? window
// 确保传进来的是Object
thisArg = Object(thisArg)
// 生成一个唯一的key值,防止和传进来的对象的key重复
const key = Symbol()
thisArg[key] = this
// 获得函数的执行结果
const result = thisArg[key](...args)
// 删除手动添加的属性,使thisArg回到最初的样子
delete obj[key]
// 返回函数的执行结果
return result
}
Function