看了网上的一些文章,感觉说的不够详尽。所以专门分三方面测试了三者区别。
先说相同点
call、apply、bind都可以传入this对象和执行参数。
区别在于,call、bind的执行参数使用可变参数的形式传入,apply的执行参数使用数组的形式传入。
从这一点上看,似乎还缺一个applyBind函数(执行参数用数组形式传入的bind)。
接着我们看一下不同点
返回值
apply、call没有返回值,bind有返回值。
执行时机
apply、call立刻执行;bind只返回新函数,不执行,直到调用返回的新函数才执行
返回值和执行时机的区别,可以通过下图的代码查看
作用周期
call、apply只对本次执行有效,bind的返回函数长久有效,且不可更改。
如下图代码,当bind绑定了参数后,即使在执行时设置新的参数,但是实际使用的仍然时绑定时的参数
如果,我们对bind的函数,使用call再次修改this对象和参数会发生什么?
参考下图代码,只要bind后,即使再次call,也无法改变bind的this对象和执行参数。
可见,bind()函数返回的对函数对象,this和执行参数都是无法修改的。
换另一种方法,试图修改bind的this对象,结果也是失败的,如下图
最后,尝试对bind过的函数进行二次bind,会发现二次bind也无法改变this对象和参数,如下图