2011-10-06 57 views
14

我想使用javascript apply()方法調用函數。如果函數沒有參數,這工作正常。即在JavaScript中調用具有參數的應用方法

function test() 
{ 
    console.log(this); 
} 

body = document.getElementsByTagName("body")[0]; // shortcut to body element 

test.apply(body); // returns [object HTMLBodyElement] 

但我似乎無法做同樣的事情,以調用具有參數的函數:

function test(msg) 
{ 
    console.log(msg); 
} 

body = document.getElementsByTagName("body")[0]; // shortcut to body element 

test(this).apply(body); // mysteriously returns the correct result, then 
// typeError: 'undefined' is not an object (evaluating "test(this).apply". 

以上的例子是完全微不足道,但我的問題的糧食是:如何做我使用apply()方法來調用帶參數的函數。

回答

26

apply的申請文件有兩個參數:

test.apply(null, [body]); 

第一個參數設置函數執行時的值爲this。第二個是該函數的一組參數。

在你的例子如下,你可以把它改寫:

function test() { 
    console.log(this); 
} 

,並調用它,如下所示:

test.apply(this); 
+0

重要的是要注意,第二個參數應該是一個數組,而不僅僅是一個單一的元素。 'test.apply(null,body)'爲我打破了(Chrome 35),但'test.apply(null,[body])'起作用。 – FeifanZ

+0

使用apply方法的真正用處是什麼好處? – Thunder

+1

我確定有很多真正的用途。有些人想到的是猴子補丁函數(包括內置函數),[可變參數函數](http://en.wikipedia.org/wiki/Variadic_function),以及爲回調函數指定'this'。 –

0

請務必在參數添加:

test.apply(body, ["my message here"]); 
8

第一注意你實際上是在調用你的函數,行:

test(this).apply(body); 

失敗,因爲在第一次,你叫test函數傳遞this作爲參數,然後嘗試在該函數的結果,這是undefined,因爲你的函數不返回任何訪問apply屬性。

undefined值上的該屬性訪問給出了TypeError異常。

現在,讓我們看看你真正想做的事,如果你想通過body變量作爲函數的參數的值是什麼,設定外this價值,爲testthis值,你可以這樣做:

test.apply(this, [body]); 

但是,這就是爲什麼call方法存在,當你確切地知道通過哪些參數,你不需要創建任何內容的數組,你只是傳遞參數:

test.call(this, body); 

當你處理例如動態數量的參數,當你知道哪些參數想要通過,並且仍然有能力設置this的值時,apply方法是非常有用的,call正是你所需要的。

+0

'call'的文檔:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call –

相關問題