2013-10-24 117 views
0

我聽說這是可以做到這樣的事情獲取函數參數

this[func].apply(this, Array.prototype.slice.call(arguments, 1)); 

但有訪問arguments對象我需要的是函數內。

所以,如果我是,例如,運行功能function1中的代碼,有沒有辦法獲得不同功能的參數function2

整個問題是我想添加事件給任何給定的元素。但是這個元素可能已經附加了另一個事件。所以,如果我有,例如,連接到一個元素中加入「onClick」事件,我將做到以下幾點:

var event = 'onclick'; 
if(typeof currentElement[event] === 'function'){ 
    cf = currentElement[event]; 
    f = function(){ 
     cf(); 
     func(); 
    } 
}else f = func; 

currentElement[event] = f; 

現在這兩個功能,新功能和先前的功能,正在被調用。問題是傳遞給前一個函數的參數在這個方法中丟失了。

有沒有人知道在我們的例子中動態調用一個函數時是否有可能不會丟失參數?

OBS:jQuery是不是一個選項:/

+0

請使用'addEventListener'或'attachEvent';非常容易。 –

+0

對於這個特定的情況,你知道這兩個函數接收什麼參數 - 它們是相同的參數,不能改變。它是所有瀏覽器中的「事件」對象,除IE之外,它未定義。 – slebetman

回答

2

聽起來像使用addEventListener會工作更好地爲您。它可以讓你連接多個監聽(函數)到一個元素:

elem.addEventListener("click", function() { 
    console.log("click listener 1"); 
}); 

elem.addEventListener("click", function() { 
    console.log("click listener 2"); 
}); 

注意,根據MDN,addEventListener在IE支持> = 9

如果你確實想繼續下當前路徑,你可以這樣做:

f = function(){ 
    cf.apply(this, arguments); 
    func.apply(this, arguments); 
} 
0
somefunction.arguments //Use the arguments property to get arguments of another function 
+0

'caller'已棄用,應予以避免。 go-oleg的下一個答案是更好的方法 –

+0

@MattGreer我不知道。我無法想象爲什麼他們會做這樣的事情。那麼,無論如何,這就是一個例子。 – bjb568

1

對於你具體的情況下,沒有必要弄清楚什麼參數傳遞給函數,因爲你知道它是什麼 - 事件OBJE ct在所有瀏覽器中,除了(舊的)IE瀏覽器,其中沒有任何內容(未定義)。

因此,代碼可以簡單地是:

var event = 'onclick'; 
if(typeof currentElement[event] === 'function'){ 
    cf = currentElement[event]; 
    f = function(e){ 
     cf(e); 
     func(e); 
    } 
} else f = func; 
currentElement[event] = f; 

如果可能的用途addEventListner和的attachEvent作爲後備與可能在網頁上運行的其他腳本發揮很好。


的更多討論:

一般情況下,這是從來沒有必要弄清楚什麼已經傳遞給回調函數,因爲這甚至沒有意義。程序員無法確定傳遞給回調函數的內容,事件發射器決定傳遞的內容。在這種情況下,它是事件對象,但這是一條通用規則。

比方說我們有我們的查詢數據庫,並返回一些數據的API:

function my_api (query) {}; // returns an object where a callback may 
          // be attached to the oncomplete property 

的API文檔中提到:

my_api()返回一個API對象。

API對象 - 有一個屬性 - oncomplete,其中可以附加回調來處理從api調用返回的數據。回調將被調用一個參數 - 返回的數據或沒有參數(未定義),如果發生錯誤。

好的。因此,我們使用這樣的:

var db = my_api('get something'); 
db.oncomplete = function (data) {alert(data)}; 

現在,如果我們想要包裝的另一個事件處理程序的onComplete事件,我們並不需要知道它接受什麼樣的數據,因爲它是確定如何通過API對象到功能,而不是功能!因此,我們只需:

var tmp = db.oncomplete; 
db.oncomplete = function (x) { 
    new_callback(x); 
    tmp(x); 
} 

我們得到不從查詢以前的回調,但是從文檔x說法。