當爲拉斐爾或g.raphael或其他圖書館我已經注意到了開發商的源代碼看確實是這樣的:爲什麼調用「apply」而不是直接調用函數?
var val = Math.max.apply(Math, data_array);
爲什麼不直接調用的功能,如:
var val = Math.max(data_array);
謝謝。
當爲拉斐爾或g.raphael或其他圖書館我已經注意到了開發商的源代碼看確實是這樣的:爲什麼調用「apply」而不是直接調用函數?
var val = Math.max.apply(Math, data_array);
爲什麼不直接調用的功能,如:
var val = Math.max(data_array);
謝謝。
我覺得從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
構造,供給的this
指prod_dept
對象,arguments
是傳遞給product
一個數組構造參數。
默認情況下,Math.max不接受列表。 「apply」允許您將列表解壓縮爲參數,以便max正常工作。
爲什麼調用「apply」而不是直接調用函數?讓我們有一個片段:
var obj = {a: "apply"};
func.call(obj, "parameter");
function func(para) {
if(this.a === "apply"){
console.log('apply');
}
}
在這裏我們可以我們使用'this'
(上下文)的函數中,如果我們直接調用FUNC不是我們沒有任何背景,比它會採取window
方面看,這是錯的。所以,如果你在你的函數中使用上下文,那麼比使用apply
方法。
.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
通常你會使用apply()
和call()
能夠設置上下文或到調用函數所屬的對象。然後,該函數將有效地成爲該對象/上下文的一種方法,如果您需要訪問上下文的字段,該方法將非常有用。
這是使用Javascript如何本身調用功能:通過端
參考:Understanding JavaScript Function Invocation and "this"通過Yehuda Katz
所以,當直接調用函數時,實際上是隱式地將默認上下文傳遞給該函數。通過使用Javascript或'window'
作爲'undefined'
當你不使用call()
或apply()
這answer還舉了一個例子可能在理解使用
好了,所以我看到Math.max有兩個參數,以便幫助其指定的上下文我只是打電話的例子, Math.max(陣列) 不起作用。所以,我想問題是我的問題中的第一行代碼如何在data_array的每個元素上調用「max」? – codecraig 2011-05-09 12:05:59
Javascript的'.apply'和'.call' ftw !! – Rudie 2011-05-09 12:08:14