Bind / Call / Apply
手写 call
原生 call
我们首先来看看 call 方法实现了什么
var foo = {
name: 'chou',
};
function sayName() {
console.log(this.name);
}
sayName.call(foo); // chou不难看出
call 改变了 this 的指向,指向到 foo 对象
sayName 方法执行了
实现
所以 如果我们
将函数设置为对象的属性
执行该函数
删除该函数
好啦 动手实现吧
但是 call 的第二个参数可以接收一个变量
同时 如果不传递参数 默认会绑定 window
好啦 我们继续模拟
手写 apply
思路
apply 和 call 的区别在于 apply 的参数接收一个数组参数 而 call 则是参数列表
我们可以取 argument 的第一个元素 因为如果正确的传递 则 argument 的第一个元素应该是我们想要的 那个作为参数的数组
我们可以对这个值进行校验
如果不是数组 则抛出异常
如果不传 则默认只调用该方法
如果是数组 则按正确的处理
实现
手写 bind
第一版
我们借用 apply 或 call 返回一个新的函数即可
第二版
我们模拟 bind 调用中可以传递参数的形式
第三版
bind 绑定的函数 还能用 new 关键字 来创建对象
TODO 此部分探索中
Last updated
Was this helpful?