可能重複:
What is the difference between call and apply?請說明申請和調用方法在JavaScript
申請並調用方法之間的主要區別是什麼? 我去通過網絡,但無法找到最佳解決方案.. 請幫我的朋友...
可能重複:
What is the difference between call and apply?請說明申請和調用方法在JavaScript
申請並調用方法之間的主要區別是什麼? 我去通過網絡,但無法找到最佳解決方案.. 請幫我的朋友...
JavaScript中的每個函數除了缺省參數外還接收兩個對象。這些是this
和arguments
。 this
的值由其調用模式決定。可以使用apply
或call
來調用函數併爲其提供默認的this
對象。
這在許多情況下會非常有用。例如,arguments
是一個類似數組的對象,但不是真正的Array
以及所有有用的數組方法。因此,對arguments
申請一個Array方法slice
,你可以這樣做:
Array.prototype.slice.apply(arguments, [1, 2])
假如arguments
一直Array
類型的對象,你也可以使用
arguments.slice(1, 2)
call
不過是一個修改版本適用。看到難以捉摸的評論。
Mr.Douglus Crockford對本視頻中的JavaScript函數有很好的介紹:Function the Ultimate。
關於'arguments'的東西有什麼相關性? – 2010-12-13 12:35:53
OP在很長一段時間裏一直在問關於JavaScript的問題。我認爲他正在開始使用JS。我認爲對函數調用模式的適當介紹會對他有用。 :) – dheerosaur 2010-12-13 12:39:38
.apply()
and .call()
非常相似。唯一的區別是他們如何將參數傳遞給被調用的函數。 .apply()
需要的參數的陣列,而.call()
可以像一個普通的函數調用中使用:
someFunction.apply(context, [argument1, argument2]);
相當於:
someFunction.call(context, argument1, argument2);
的主要區別在於,call
接受的參數,其中參數的列表後的第一個被直接傳遞給該方法:
myFunc.call(thisObj, arg1, arg2, arg3);
鑑於apply
只接受兩個芳guments - 首先是this
對象和第二被參數數組傳遞到方法:
myFunc.apply(thisObj, [arg1, arg2, arg3]);
apply
通常在要傳遞的arguments
對象,其中包含的列表的情況下使用傳遞給當前函數的參數轉換爲另一種方法:
function myOtherFunc(arg1, arg2, arg3) {
if (typeof arg1 == "object" && arg1 !== null)
myFunc.apply(this, arguments);
}
謝謝你,很高興聽到..但我們可以在任何情況下使用任何方法或有任何限制這些mehtods .. – Mihir 2010-12-13 12:12:04
@Mihir:'應用'可以用來代替'call'幾乎任何你能想到的地方的。然而'call'並不是'apply'的一個很好的替代品,因爲它不是動態的。我已經更新了我的答案,給你一個使用'apply'的例子。 – 2010-12-13 12:15:46
@Mihir:'call'只是'apply'的語法糖。使用一個參數就可以更輕鬆地調用函數。 – 2010-12-13 12:17:16
沒有*最好*解決方案;) – 2010-12-13 12:09:11
@Felix:+1,它沒有發生在我身上,這可能是一個騙局。 – 2010-12-13 12:10:30
@Felix Kling:哎呀,沒有注意到那個;) – jwueller 2010-12-13 12:15:15