先說觀點:不管是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。性能