将任意数量的参数传递给JavaScript函数

时间:2011-07-21 01:19:46

标签: javascript

我的JavaScript代码几乎不是一个Ajax请求,它要求从后端返回XML。后端可以返回execute_callback作为XML标记之一:

<?xml version="1.0" encoding="windows-1251"?>
<response>
    <execute_callback>
        <function_name>someFunction</function_name>
    </execute_callback>
</response>

只要你知道callback期望的参数的确切数量,一切都会好的。但是如果后端返回了怎么办

<?xml version="1.0" encoding="windows-1251"?>
<response>
    <execute_callback>
        <function_name>someFunction</function_name>
        <param>10.2</param>
        <param>some_text</param>
    </execute_callback>
    <execute_callback>
        <function_name>otherFunction</function_name>
        <param>{ x: 1, y: 2 }</param>
    </execute_callback>
</response>

我现在如何将参数10.2和'some_text'传递给someFunction,将JSON {x:1,y:2}传递给otherFunction

我知道一个丑陋的解决方案(使用函数arguments),但我正在寻找一个漂亮的解决方案。

在我忘记之前:不要为我解析XML - 我可以自己解决这个问题:)我需要的只是一些技巧,可以将任意数量的参数传递给JavaScript中的函数。如果你知道Python,我想要:

def somefunc(x, y):
    print x, y
args = { 'x' : 1, 'y' : 2 }
somefunc(**args)

但是在JavaScript中。

3 个答案:

答案 0 :(得分:9)

您可以将它们全部传递到您的函数中:

function someFunction(){
    for(i = 0; i < arguments.length; i++)
        alert(arguments[i]);
}

Javascript函数有一个类似于数组的参数对象,使用任意数量的参数调用javascript函数在语法上是正确的。

someFunction(1, 2, 'test', ['test', 'array'], 5, 0);

是对该函数的有效调用。

答案 1 :(得分:6)

您可以参考Function.apply。假设回调函数在全局对象(浏览器中为window)中声明。

var callback_function = window[function_name];
if (callback_function) { // prevent from calling undefined functions
    callback_function.apply(window, params);  // params is an array holding all parameters
}

答案 2 :(得分:0)

不是调用函数,而是通过名称将函数引用为关联数组中的元素:

var funcName = // parse your xml for function name
var params = new Array();
params[0] = 10.2; // from your parsed xml
params[1] = 'some text'; // also from your parsed xml

// functions are attached to some Object o:

o[funcName](params); // equivalent to o.funcName(params);

我在这里写了一个上面的例子:http://jsbin.com/ewuqur/2/edit