2012-10-13 72 views
0

我有一個自定義對象,它實現了稍後將被執行的函數。這裏的人會怎麼稱呼它:Javascript:在調用它們之前修改回調函數的參數

customObject.onSomething(function(e) { 
    // do something with e 
    console.log('foobar'); 
}); 

這裏的onSomething如何得到創建:

var CustomObject = function() { 
    this.onSomething = function(callback) { 
     // If the user passes in parameter(s), how can I modify them before calling? 
     callback.apply(this); 
    } 
} 

我怎樣才能修改參數(S)用戶進行申請呼叫之前傳遞在功能上?

+1

你會如何想修改呢? – 0x499602D2

+0

我想將e設置爲當用戶調用該函數時對用戶有意義的內容。 – Sai

回答

6

apply需要第二個參數,它是要傳遞給函數的參數列表。 call也是如此,只是它傳遞了自己的參數列表(在用作this的第一個參數之後的所有內容)。

所以,如果你知道哪些參數想到,你只需將其作爲第二個參數添加到調用函數apply(或作爲參數來call列表):

this.onSomething = function(arg1, arg2) { 
    // reverse the first and second arguments 
    callback.apply(this, [arg2, arg1]); 
    // equivalent: 
    callback.call(this, arg2, arg1); 
}; 

如果你不不知道期望什麼樣的論據,但你仍然想對它們做些什麼,你可以用內置的僞數組來保存給當前函數的參數(即使你沒有明確地聲明它們)。

您可以使用它來調用具有相同參數的調用函數或對其進行一些轉換;例如: -

this.onSomething = function() { 
    // call callback with the same arguments we got 
    callback.apply(this, arguments); 

    // or, make some changes 
    var newArgs = ["extra argument", arguments[1], arguments[0]]; 
    callback.apply(this, newArgs); 
}; 
+0

這就是我一直在尋找的。謝謝!讓我問你:如果用戶發送n個參數(未知)會怎麼樣。我如何動態地將它們傳遞迴應用? – Sai

+2

那麼,'arguments'將保存'n'項,這些項是賦給調用函數的參數。如果你需要傳遞這些,請調用'apply(this,arguments)'。如果你想改變它們,可以從你得到的數組中創建一個新數組(你可以檢查'arguments',檢查它的長度,複製它的元素等等),並將其傳遞給'apply'。我編輯了我的答案以反映這一點。 – Avish

+0

啊好的!之後我纔看到你的編輯。謝謝! – Sai

1

聽起來像你問的相當簡單,見下圖:

var CustomObject = function() { 
    this.onSomething = function(callback, param1, param2) { 
     param1 += 4; 
     param2 = 'Something about ' + param2 + ' is different...'; 
     callback.apply(this, [param1, param2]); 
    } 
} 
相關問題