资料内容:
1 call、apply、bind的区别
相同点:
作用相同,都是动态修改this指向;都不会修改原先函数的this指向。
异同点:
1. 执行方式不同:
call和apply是改变后页面加载之后就立即执行,是同步代码。
bind是异步代码,改变后不会立即执行;而是返回一个新的函数。
2. 传参方式不同:
call和bind传参是一个一个逐一传入。
apply可以使用数组的方式传入的 。
call和 apply不能使用剩余参数的方式传参,bind 可以使用剩余参数的方式传入(柯里化)。
3. 修改this的性质不同:
call、apply只是临时的修改一次,也就是call和apply方法的那一次;当再次调用原函数的时候,它的指
向还是原来的指向。
手写 call 函数
call 函数的实现步骤:
判断调用对象是否为函数,即使我们是定义在函数的原型上的,但是可能出现使用 call 等方式调用的情况。
判断传入上下文对象是否存在,如果不存在,则设置为 window 。
处理传入的参数,截取第一个参数后的所有参数。
将函数作为上下文对象的一个属性。
使用上下文对象来调用这个方法,并保存返回结果。
删除刚才新增的属性。
返回结果。
手写 apply 函数
我们已经了解了 call的实现原理,call() 方法接受的是参数列表,而 apply() 方法接受的是一个参数数
组。所以在 call 实现的基础上我们很容易写出 apply
apply 函数的实现步骤:
判断调用对象是否为函数,即使我们是定义在函数的原型上的,但是可能出现使用 call 等方式调用的情况。
判断传入上下文对象是否存在,如果不存在,则设置为 window 。
将函数作为上下文对象的一个属性。
判断参数值是否传入
使用上下文对象来调用这个方法,并保存返回结果。
删除刚才新增的属性
返回结果