2011-05-09 177 views
12

當爲拉斐爾或g.raphael或其他圖書館我已經注意到了開發商的源代碼看確實是這樣的:爲什麼調用「apply」而不是直接調用函數?

var val = Math.max.apply(Math, data_array); 

爲什麼不直接調用的功能,如:

var val = Math.max(data_array); 

謝謝。

+0

好了,所以我看到Math.max有兩個參數,以便幫助其指定的上下文我只是打電話的例子, Math.max(陣列) 不起作用。所以,我想問題是我的問題中的第一行代碼如何在data_array的每個元素上調用「max」? – codecraig 2011-05-09 12:05:59

+2

Javascript的'.apply'和'.call' ftw !! – Rudie 2011-05-09 12:08:14

回答

11

我覺得從Mozilla Docs解釋描述得好:

調用現有的功能時,您可以分配不同的對象 。 這個是指當前對象,即 調用對象。通過申請,您可以在 中寫入一次方法,然後在另一個對象中繼承 ,而不必爲 重寫新的 對象的方法。

應用與呼叫非常相似,但支持的參數類型爲 。 您可以使用參數數組而不是 命名的一組參數。與 應用,可以使用一個數組文本, 例如,fun.apply(此,[名稱, 值]),或陣列對象, 例如fun.apply(這一點,新 陣列(名稱,值))。

至於參數:

thisArg 確定的裏面好玩的價值。如果thisArg爲空或 undefined,這個將是全球 對象。否則,這將等於 到Object(thisArg)(如果thisArg已經是對象,則爲thisArg ,或 字符串,布爾值或數字(如果thisArg 是 對應類型的原始值)。因此,當該函數執行時,這個==「 」對象的類型總是爲 。

argsArray 的參數數組爲對象,指定與該 樂趣應該被調用,或空或 未定義如果沒有參數應該提供給函數 的參數。

該文檔給出了適用的用例的一個很好的例子。在下面的例子,應用用於鏈構造:

function product(name, value) 
{ 
    this.name = name; 
    if (value >= 1000) 
    this.value = 999; 
    else 
    this.value = value; 
} 

function prod_dept(name, value, dept) 
{ 
    this.dept = dept; 
    product.apply(this, arguments); 
} 
prod_dept.prototype = new product(); 

// since 5 is less than 1000 value is set 
var cheese = new prod_dept("feta", 5, "food"); 

// since 5000 is above 1000, value will be 999 
var car = new prod_dept("honda", 5000, "auto"); 

注意,在prod_dept構造,供給的thisprod_dept對象,arguments是傳遞給product一個數組構造參數。

12

默認情況下,Math.max不接受列表。 「apply」允許您將列表解壓縮爲參數,以便max正常工作。

2

爲什麼調用「apply」而不是直接調用函數?讓我們有一個片段:

var obj = {a: "apply"}; 
func.call(obj, "parameter"); 
function func(para) { 
    if(this.a === "apply"){ 
     console.log('apply'); 
    } 
} 

在這裏我們可以我們使用'this'(上下文)的函數中,如果我們直接調用FUNC不是我們沒有任何背景,比它會採取window方面看,這是錯的。所以,如果你在你的函數中使用上下文,那麼比使用apply方法。

0

.apply當意圖使用參數值列表來調用可變參數時經常使用,例如,

Math.max([value1[,value2, ...]])函數返回零個或多個數字中最大的一個。

Math.max(10, 20); // 20 
Math.max(-10, -20); // -10 
Math.max(-10, 20); // 20 

Math.max()方法不允許您傳入數組。如果您有一個需要獲得最大值的值列表,您通常會使用Function.prototype.apply()(例如,

Math.max.apply(null, [10, 20]); // 20 
Math.max.apply(null, [-10, -20]); // -10 
Math.max.apply(null, [-10, 20]); // 20 

然而,隨着ECMAScript的6,你可以使用spread operator

蔓延運營商允許表達式的地方擴展,其中多個參數(函數調用)或多個元素(數組文字)。

Math.max(...[10, 20]); // 20 
Math.max(...[-10, -20]); // -10 
Math.max(...[-10, 20]); // 20 

當調用使用一個可變操作的功能,你甚至可以添加額外的值,例如

Math.max(...[10, 20], 50); // 50 
Math.max(...[-10, -20], 50); // 50 
0

通常你會使用apply()call()能夠設置上下文或到調用函數所屬的對象。然後,該函數將有效地成爲該對象/上下文的一種方法,如果您需要訪問上下文的字段,該方法將非常有用。

這是使用Javascript如何本身調用功能:通過端

  • 第一個參數是thisValue
  • 調用函數使用這組到

    1. 做一個參數列表(arglist中)出來的參數1 thisValue和ARGLIST作爲它的參數列表

    參考:Understanding JavaScript Function Invocation and "this"通過Yehuda Katz

    所以,當直接調用函數時,實際上是隱式地將默認上下文傳遞給該函數。通過使用Javascript或'window'作爲'undefined'當你不使用call()apply()

    answer還舉了一個例子可能在理解使用

  • 相關問題