1

其目的是構建一個包裝以提供一種在各種腳本宿主上調用具有可變參數的本機函數的一致方法 - 以便可以執行該腳本在瀏覽器中以及在Windows Script Host或其他腳本引擎中。
我知道3種方法,每種方法都有其自身的缺點。如何在JavaScript中創建一個可變參數(帶有可變長度參數列表)函數包裝

  1. eval()方法:

    function wrapper() { 
        var str = ''; 
        for (var i=0; i<arguments.lenght; i++) 
         str += (str ?', ':'') + ',arguments['+i+']'; 
        return eval('[native_function] ('+str+')'); 
        } 
    
  2. 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]); 
         } 
        } 
    
  3. apply()方法:

    function wrapper() { 
        return [native_function].apply([native_function_namespace], arguments); 
        } 
    

你問他們有什麼問題?

  1. 那麼,我們應該深入探究爲什麼eval()是邪惡的所有原因?而且所有的字符串連接...不是一個標籤爲「優雅」的解決方案。

  2. 永遠不可能知道最多的n,因此有多少cases準備。這也會使劇本成爲巨大的比例,並且違背神聖的原則。

  3. 該腳本可能會在不支持apply()方法的較舊(JavaScript 1.3/ECMA-262-3)引擎上執行。

現在問題部分:有沒有其他解決方案呢?

+2

今天使用的Javascript引擎不支持'.apply()'? – SLaks 2010-03-18 19:22:34

+0

你的意思是哪個本地功能?我想不出任何根據環境而有不同參數的 – meouw 2010-03-18 19:25:51

+2

沒有這樣一個過時的Javascript實現的平臺將足以讓你擔心。很有可能在這樣的平臺上這個問題將成爲你最擔心的問題。 – Pointy 2010-03-18 19:26:59

回答

3

只需使用apply()。和爲貴陳舊執行引擎,只是這樣做

if ('undefined' == typeof Function.prototype.apply) 
{ 
    Function.prototype.apply = function(context, args) 
    { 
    // whatever hacky way you want to implement it - i guess eval. 
    } 
} 
+0

那麼,沒有第四種方法?那麼,我會繼續這樣做。謝謝! – 2010-03-18 21:18:25

-1

就像自動「這個」變量,也就是持有傳遞給函數的所有參數的「論據」變量。見javascript variadic

+1

問題是關於創建一個variadic ** wrapper **函數,它將所有參數傳遞給另一個函數。 *提示:下次嘗試閱讀整個問題。*另外,您不能從外部覆蓋另一個函數的'arguments'對象。 – 2012-04-19 23:02:28

相關問題