從一開始,我是在書上看到關於bind()、call() 和 apply(), 不過長久以來,在工做中與網上接觸到了不少關於這三個方法的使用場景,對這三個方法也算是比較熟悉了。因此把他們的做用和區別簡單闡述一下!javascript
javaScript權威指南上的解釋是: call() 、apply()能夠看做是某個對象的方法,經過調用方法的形式來間接調用函數。bind() 就是將某個函數綁定到某個對象上。java
關於call() 和 apply() 在犀牛書上的解釋可能比較生澀難懂,個人理解就是,它們的做用是: 讓函數在某個指定的對象下執行。數組
例:app
var obj = {x: 1} function foo() {console.log(this.x)} foo.call(obj) //打印結果: 1
call() 和apply()的第一個參數相同,就是指定的對象。這個對象就是該函數的執行上下文。函數
call()和apply()的區別就在於,二者之間的參數。this
call()在第一個參數以後的 後續全部參數就是傳入該函數的值。apply() 只有兩個參數,第一個是對象,第二個是數組,這個數組就是該函數的參數。spa
例1:code
var obj = {}; function foo(a, b, c) { console.log(b); } foo.call(obj, 1, 2, 3) //打印結果: 2;
例2:對象
var obj = {}; function foo(a, b, c) { console.log(b); } foo.apply(obj, [1, 2, 3]) 打印結果: 2;
bind() 方法和前二者不一樣在於: bind() 方法會返回執行上下文被改變的函數而不會當即執行,而前二者是直接執行該函數。他的參數和call()相同。blog
這三個方法的做用都是改變函數的執行上下文!