2010-12-13 34 views
2

可能重複:
What is the difference between call and apply?請說明申請和調用方法在JavaScript

申請並調用方法之間的主要區別是什麼? 我去通過網絡,但無法找到最佳解決方案.. 請幫我的朋友...

+0

沒有*最好*解決方案;) – 2010-12-13 12:09:11

+0

@Felix:+1,它沒有發生在我身上,這可能是一個騙局。 – 2010-12-13 12:10:30

+0

@Felix Kling:哎呀,沒有注意到那個;) – jwueller 2010-12-13 12:15:15

回答

5

JavaScript中的每個函數除了缺省參數外還接收兩個對象。這些是thisargumentsthis的值由其調用模式決定。可以使用applycall來調用函數併爲其提供默認的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

+0

關於'arguments'的東西有什麼相關性? – 2010-12-13 12:35:53

+2

OP在很長一段時間裏一直在問關於JavaScript的問題。我認爲他正在開始使用JS。我認爲對函數調用模式的適當介紹會對他有用。 :) – dheerosaur 2010-12-13 12:39:38

3

.apply() and .call()非常相似。唯一的區別是他們如何將參數傳遞給被調用的函數。 .apply()需要的參數的陣列,而.call()可以像一個普通的函數調用中使用:

someFunction.apply(context, [argument1, argument2]); 

相當於:

someFunction.call(context, argument1, argument2); 
+0

謝謝,很高興聽到..但我們可以使用任何方法在任何情況下或對這些方法有任何限制。 – Mihir 2010-12-13 12:13:23

+0

@Mhir:這兩種方法都是函數對象原型的成員。兩者都可以用於任何功能。 – jwueller 2010-12-13 12:14:32

3

的主要區別在於,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); 
} 
+0

謝謝你,很高興聽到..但我們可以在任何情況下使用任何方法或有任何限制這些mehtods .. – Mihir 2010-12-13 12:12:04

+0

@Mihir:'應用'可以用來代替'call'幾乎任何你能想到的地方的。然而'call'並不是'apply'的一個很好的替代品,因爲它不是動態的。我已經更新了我的答案,給你一個使用'apply'的例子。 – 2010-12-13 12:15:46

+1

@Mihir:'call'只是'apply'的語法糖。使用一個參數就可以更輕鬆地調用函數。 – 2010-12-13 12:17:16