手写bind
前言
又是一年的金三银四,疯狂的手写剧情再度上演,接下来就让我们一起来实现下JavaScript里的bind函数。
一、思路梳理
在实现手写bind之前让我们先来梳理下bind函数的使用场景。通常我们在使用bind的时候,需要两个对象(所有的一切都是对象🙈):
- 想要执行的function(我们假设叫foo)。
- 希望能够调用foo的对象(我们假设叫obj)。
那我们在实现bind函数的时候主要突破点就是能够获取到foo以及obj。
还有一点bind和apply或者call方法不同的地方。bind会返回一个函数,再次执行返回的函数,才能是我们目标函数的真正的执行结果。所以对于目标函数foo原本需要的参数的传递方式就有三种情况:
- 在调用bind函数时传递
- 在调用bind返回的函数时传递
- 在调用bind时传递一部分,调用bind返回的函数时传递一部分。
这是在实现bind函数时另一个需要注意的地方。
那么接下来我们就带着这样的一个思路来实现bind方法吧。
二、bind方法的实现
function jBind(thisArg,...args) {
return (...argus) => {
// 传进来的是null和undefined时将this指向为window
thisArg = thisArg ?? window
// 确保传进来的是Object
thisArg = Object(thisArg)
// 生成一个唯一的key值,防止和传进来的对象的key重复
const key = Symbol()
thisArg[key] = this
// 获得函数的执行结果
const result = thisArg[key](...[...args, ...argus])
// 删除手动添加的属性,使thisArg回到最初的样子
delete obj[key]
// 返回函数的执行结果
return<