function.call(thisArg, arg1, arg2, ...)
我們可以通過下面的範例看看 call() 函數的用法:
// 定義一個add()函數 function add(x, y) { return x + y; } // 通過call()函數進行add()函數的呼叫 function myAddCall(x, y) { // 呼叫add()函數的call()函數 return add.call(this, x, y); } console.log(myAddCall(10, 20)); //輸出“30”
myAddCall() 函數自身是不具備運算能力的,但是我們在 myAddCall() 函數中,通過呼叫 add() 函數的 call() 函數,並傳入 this 值,將執行 add() 函數的主體改變為myAddCall() 函數自身,然後傳入引數 x 和 y,這就使得 myAddCall() 函數擁有 add() 函數計算求和的能力。在實際計算時,就為 10 + 20 = 30。
function.apply(thisArg, [argsArray])
[argsArray]
表示的是引數會通過陣列的形式進行傳遞,如果 argsArray 不是一個有效的陣列或者 arguments 物件,則會丟擲一個 TypeError 異常。//定義一個add()函數 function add(x, y) { return x + y; } // 通過apply()函數進行add()函數的呼叫 function myAddApply(x, y) { // 呼叫add()函數的apply()函數 return add.apply(this, [x, y]); } console.log(myAddApply(10, 20)); //輸出“30”與 call() 函數相比,apply() 函數只需要將 add() 函數接收的引數使用陣列的形式傳遞即可,即使用
[x, y]
的形式,執行後的結果為 10 + 20 = 30。
function.bind(thisArg, arg1, arg2, ...)
事實上,bind() 函數與 call() 函數接收的引數是一樣的,其返回值是原函數的副本,並擁有指定的 this 值和初始引數。//定義一個add()函數 function add(x, y) { return x + y; } // 通過bind()函數進行add()函數的呼叫 function myAddBind(x, y) { // 通過bind()函數得到一個新的函數 var bindAddFn = add.bind(this, x, y); // 執行新的函數 return bindAddFn(); } console.log(myAddBind(10, 20)); //輸出“30”