javaScript權威指南上的解釋是: call() 、apply()可以看作是某個對象的方法,通過調用方法的形式來間接調用函數。bind() 就是将某個函數綁定到某個對象上。
關于call() 和 apply() 在犀牛書上的解釋可能比較生澀難懂,我的了解就是,它們的作用是: 讓函數在某個指定的對象下執行。
例:
var obj = {x: 1}
function foo() {console.log(this.x)}
foo.call(obj) //列印結果: 1
call() 和apply()的第一個參數相同,就是指定的對象。這個對象就是該函數的執行上下文。
call()和apply()的差別就在于,兩者之間的參數。
call()在第一個參數之後的 後續所有參數就是傳入該函數的值。apply() 隻有兩個參數,第一個是對象,第二個是數組,這個數組就是該函數的參數。
那就可以了解為:
var obj = {};
function fn(a,b,c){}
fn.call(obj,a,b,c); //第一個參數是該函數的對象,其餘參數是函數的參數;
fn.apply(obj,[a,b,c]); //第一個參數是函數的對象,第二個參數是由函數的參數組成的數組
例1:
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()相同。
fn.bind(obj,a,b,c); //與call()的參數相同
這三個方法的作用都是改變函數的執行上下文!