2013-09-25 216 views
3

我試圖將任意數量的參數傳遞給函數。參數應該是json類型[function:arrayOfArgs]。鍵是函數,值是參數的數組,應該傳遞給這些函數。將函數數組傳遞給另一個函數

起初,我認爲功能只有一些說法

function _gl(f,args){ f.apply(null,args); } 

function func(a,b){ alert(a+b); } 

//調用函數

<input type="button" value="test" onclick="_gl(func,['2','3']);"/> 

和它的作品相當不錯。現在我想概括這種方法

function _GL(){ 
     var arguments = _GL.arguments; 

     var i=0; 
     for(i;i<arguments.length;i++) 
     { 
     var A=arguments[i]; 
     for(j in A) j.apply(null,A[j]); 
     } 
    } 

//並調用它

<input type="button" value="TEST" onclick="_GL({func:['2','3']});"/> 

但我收到以下錯誤「Uncaught TypeError:Object func has no method'apply'」。

+0

'func'你傳遞的是Event對象,它不是一個函數,它爲什麼要這樣呢? – gdoron

+0

您將數組'['2','3']'傳遞給屬性func。 – 0xcaff

+0

'應該是json類型... ... JSON是數據的*字符串表示*。你的數組是*不是*「JSON類型」。這只是一個「正常」的JavaScript數組。如果它是JSON,它是一個字符串。如果它不是字符串,那不是JSON。 –

回答

1

您可以使用此代碼jsFiddle

_GL = function() { 
    var arguments = _GL.arguments; 
    var i = 0; 
    for (i = 0; i < arguments.length; i++) { 
     var arg = arguments[i]; 
     for (j in arg) { 
      var f = window[j]; 
      f.apply(null, arg[j]); 
     } 
    } 
}; 

正如你可以看到你必須讓你的函數f首先從它的名字window元素。然後f有正確的類型args可以應用。

1
{func:['2','3']} 

你正在一個名爲"func"與價值['2','3']一(串)鍵的對象。字符串不是函數,所以它沒有.apply()

在對象中,您的密鑰必須是是字符串,您不能將其他類型用作密鑰。


要「推廣」它,你應該傳遞一個函數及其參數數組。事情是這樣的:

[[func, ['2','3']], [func2, ['abc']] 

所以,如果你這樣做:

onclick="_GL([[func, ['2','3']], [func2, ['abc']]);" 

,那麼你可以遍歷並獲得功能和呼叫他們。

function _GL(funcs){ 
    for(var i=0, len=funcs.length; i < len; i++){ 
     var func = funcs[i]; 
     func[0].apply(null, func[1]); 
    } 
} 
+0

謝謝你RockeT Hazmat你的答案。我能做些什麼來使這個功能起作用? – Paramore

+0

@Paramore:我編輯了我的答案並給了你一個可能的解決方案。 –

1

一種可能的解決方案;

var _gl = function (callables) { 

    // Loop through each property in the passed in object 
    for (var fnName in callables) { 

     // Only apply for properties that is local to `callables` 
     if (callables.hasOwnProperty(fnName)) { 
      window[fnName].apply(callables[property]); 
     } 

    } 

}; 

... onclick='_gl({"MyFunction": ["a", 1, []]});' ... 

而不是使用全局名稱空間,你可以(也應該!)設置一個對象與你的可調用函數。

相關問題