2013-07-17 23 views
0

情景在傳遞函數的方法固定參數,而不使用eval

我有一個「主對象」 System含有稱爲System.Test方法。它接受,例如,三個參數System.Test(id, a, b)

現在我有很多對象(User[1],User[2], User[3] ...),我也想要.Test方法可用。但是,它通過的id參數對每個User[X]對象都是唯一的,並且應該是固定的,例如,如果我呼叫User[1].Test(a, b)它應該自動映射到System.Test(1, a, b)

我所做到目前爲止

User[X]對象的量是可變的。假設我正在循環其中的每一個,並且我的ID在一個名爲id(= 1,2,3 ...)的變量中。我嘗試在循環中使用此代碼。

User[X].Test = function(a, b) { 
    return System.Test(X, a, b); 
} 

但是,這並不按預期方式工作。在調用用戶[X] .Test()時,它只是傳遞到System.Test函數循環中的最後一個鍵X,而不是每個用戶[X]對象唯一的X.

的醜陋的方式 - 問題

的解決方案似乎相當簡單,如果我可以使用EVAL

eval("User[X].Test = function(a, b) { return System.Test(" + X + ", a, b); }"); 

現在,這可以作爲黑客工作。但是.Test只是一個例子,並且我無法想象一旦方法的數量增加,就會使用數十個調用。儘管在eval中注入的唯一變量是X(並且我可以保證X在內部生成並且完全安全 - 沒有惡意代碼執行風險) - 使用eval使我感到不安。有沒有更好的方法來做到這一點,我不知道?謝謝。

回答

0

可以使用bind爲部分應用程序:

User[X].Test = System.Test.bind(null, X); 
+0

偉大的作品,謝謝!如果我想使用類似於.bind()的函數來追加**參數,該怎麼辦?或者是太麻煩了,我應該簡單地統一一切來預先考慮'X'? –

+0

請注意,某些舊瀏覽器(例如IE8)沒有'Function.prototype.bind()'。請參閱https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind#Browser_compatibility – Mics

+0

您可以將其包裝在一個匿名函數中,該函數需要更多參數並調用其他函數。 – elclanrs