【问题标题】:Pass an arbitrary number of parameters into a JavaScript function将任意数量的参数传递给 JavaScript 函数
【发布时间】:2011-07-21 01:19:45
【问题描述】:

我的 JavaScript 代码几乎不是一个期望从后端返回 XML 的 Ajax 请求。后端可以将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 中。

【问题讨论】:

  • 如何区分文字(例如 10.2 和“某些文本”)和需要计算的表达式(例如 { x: 1, y: 2 })?
  • @RobG 这与问题无关。示例始终只是示例。第一个想法:我会将type 属性传递给&lt;param&gt;。了解返回什么类型根本不是问题。

标签: javascript


【解决方案1】:

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

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

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

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

是对该函数的有效调用。

【讨论】:

  • 哦哈哈,我觉得没那么丑:)
  • Arguments 不是一个数组,它是一个 arguments 对象。
【解决方案2】:

您可以参考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
}

【讨论】:

  • +1 - 我认为这是最好的方法,虽然可能应该受到if (window[function_name])... 的保护。但是如何从标识符和表达式中区分文字呢?我猜它们都是作为字符串传递的,并且被调用的函数可以解决。
  • 完美。正是我正在寻找的。顺便说一句,我更喜欢if (typeof fn == 'function') {
【解决方案3】:

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

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

【讨论】:

  • function somefunc(x,y) { alert(x+y); } 我想通过 ['a', 'b']。 somefunc.apply(window, ['a', 'b']) -> “ab”。 window['somefunc'](['a','b']) -> “abundefined”。奇数:-(
  • @Nemoden:那不是我说要做的。申请是没有必要的。 jsbin.com/ewuqur/2/edit
  • 使用 Function.apply 是另一种方法,它有效。我只是将它与您的方法进行了比较,结果出乎意料。
  • @Nemoden,您的第二个示例也不起作用。为什么要将您的函数附加到全局窗口对象?这是一个糟糕的做法。我将我的函数附加到我自己的对象上,并通过闭包限制范围和访问。
  • 对不起,我把那里的代码搞砸了。只需将window['somefunc'](['a','b']) 替换为somefunc.apply(window, ['a', 'b'])。我看不出有什么理由不应该将我的 javascript 函数附加到 window 对象,除非你称之为“糟糕的做法”,我不明白为什么,所以我仍然不考虑这是一个强有力的理由。为什么checkEmail(str)函数,它验证一个字符串是一个电子邮件,例如,应该附加到某个对象,而不是window
猜你喜欢
  • 2023-04-03
  • 2017-12-18
  • 2022-06-27
  • 1970-01-01
  • 2012-09-24
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多