先说观点:不管是bind、apply仍是call,最大的好处就是代码复用。javascript
在开发中,咱们只有复用代码时,才会出现this指向须要改动的状况。
纵观bind的经常使用方法,不管是偏函数仍是快捷调用等等,即便是setTimeout,也都是但愿能把别的地方的方法拿过来用,才会出现this指向不对的状况。
一言以蔽之:由于是面向对象,才会出现绑定this的须要。
这话并非空穴来风,面向对象的好处就在于抽象程度高,封装好的一个类,能够在不改变源码的状况下,通过一些操做,拿来即用。这是一个无比方便的地方,相信改过别人代码的同窗对此深有体会。
面向对象通过高度的抽象,使得代码复用更加方便,也致使了更多的模块管理相关的问题,这又是一个大课题,就不细讲了。
不管是出于性能仍是开发成本的考虑,咱们在开发中,常常要用其余对象上的方法。举个例子,把类数组对象转为数组对象:java
var transfer = Function.prototype.apply.bind(Array.prototype.slice); transfer(obj);
bind的其余用法能够参考MDN,我在这里很少写了。数组
call和apply大同小异,惟一不一样在于传参,call接受变长参数,apply接受数组或者类数组对象。
具体使用方法,参考MDN,call、apply
一样的,call和apply也是由于想要复用代码,出现了this指向不对的状况,怎么办,给它传this吧,传哪指哪。
举个例子:app
var say = { name: 'Mike', hi: function () { console.log('hi ' + this.name) } }; function sayHi(name){ this.name = name; } say.hi.call(new sayHi('Bob'));
bind和call的区别就在于,bind会返回一个新的函数,call和apply都是直接调用原函数,并不会返回一个新函数。函数
在须要新函数的地方用bind,只是想作一锤子买卖,就用call和apply。
在不清楚多少参数的地方,建议new一个数组,push参数进去,或者大部分状况下,能够传arguments对象,就用apply,不然,就用call。性能