其目的是構建一個包裝以提供一種在各種腳本宿主上調用具有可變參數的本機函數的一致方法 - 以便可以執行該腳本在瀏覽器中以及在Windows Script Host或其他腳本引擎中。
我知道3種方法,每種方法都有其自身的缺點。如何在JavaScript中創建一個可變參數(帶有可變長度參數列表)函數包裝
eval()
方法:function wrapper() { var str = ''; for (var i=0; i<arguments.lenght; i++) str += (str ?', ':'') + ',arguments['+i+']'; return eval('[native_function] ('+str+')'); }
switch()
方法:function wrapper() { switch (arguments.lenght) { case 0: return [native_function] (arguments[0]); break; case 1: return [native_function] (arguments[0], arguments[1]); break; ... case n: return [native_function] (arguments[0], arguments[1], ... arguments[n]); } }
apply()
方法:function wrapper() { return [native_function].apply([native_function_namespace], arguments); }
你問他們有什麼問題?
那麼,我們應該深入探究爲什麼
eval()
是邪惡的所有原因?而且所有的字符串連接...不是一個標籤爲「優雅」的解決方案。永遠不可能知道最多的
n
,因此有多少cases
準備。這也會使劇本成爲巨大的比例,並且違背神聖的原則。該腳本可能會在不支持
apply()
方法的較舊(JavaScript 1.3/ECMA-262-3)引擎上執行。
現在問題部分:有沒有其他解決方案呢?
今天使用的Javascript引擎不支持'.apply()'? – SLaks 2010-03-18 19:22:34
你的意思是哪個本地功能?我想不出任何根據環境而有不同參數的 – meouw 2010-03-18 19:25:51
沒有這樣一個過時的Javascript實現的平臺將足以讓你擔心。很有可能在這樣的平臺上這個問題將成爲你最擔心的問題。 – Pointy 2010-03-18 19:26:59