在JavaScript中向函数传递任意数量的参数

3
我想编写一个类似以下方式的javascript函数……
f([["a"]], function(e){alert(e);});
// results in alert("a");

f([["a"], ["b"]], function(e1,e2){alert(e1 + ":" + e2);});
//results in alert("a:b");

f([["a", "b"], ["c"]], function(e1,e2){alert(e1 + ":" + e2);});
//results in alert("a:c");alert("b:c");

我可以为循环想出一个递归解决方案,但是如何将“未知”数量的变量发送到函数中呢?

5个回答

3

如果你将所有的参数放入一个数组中(我们称之为foo),你可以使用apply函数调用一个带有这些参数的函数fn

fn.apply(null, foo)

第一个参数(在这种情况下是null)是你希望调用函数时this所代表的内容。使用null可能适用于你。


2
根据这个页面,您可以使用arguments变量访问任何/所有参数:
function f() {
    for( var i = 0; i < arguments.length; i++ ) {
         //do something with arguments[i]
    }
}

[编辑]

现在我明白你想做什么了,这里有一种(肮脏的)方法可以实现:

认真地说,不要用这种方法。它非常糟糕。小狗会死的。

function f(arr, fn) {
    var s = "fn(";
    for( var i = 0; i < arr.length; i++ ) {
        //you can implement your recursive code here if you like; I'm just doing the base cases
        s += arr[i];
        if(i+1 < arr.length) {
            s += ",";
        }
    }
    s += ");";
    eval(s);
}

另外一种更简洁的方法:

function f(arr, fn) {
    fn.apply(this, arr);
}

f()有固定的参数。一个数组的数组和一个函数 - 我需要向匿名警报函数发送未知数量的参数。 - mncl
@mncl 我的意思是,如果你传递给 f 一个三元素数组,那么这个匿名函数会接受三个参数吗?它是否必须接受与数组长度相同数量的参数?如果不是(如果匿名函数可以随意接受任意数量的参数),那么就没有可行的方法来实现这个。 - NickAldwin
它需要3,然后是的。但用你自己的替换它 for( var i = 0; i < arguments.length; i++ ) { //使用arguments[i]做一些事情 } 对于未知大小的数组,这样更有意义。 - mncl
@mncl 我现在明白你想要什么了。看看我的新答案是否有帮助(它很丑,但至少不需要使用“eval”)。 - NickAldwin
fn未定义 @ var callFunc = new Function(s); 我不熟悉Function对象的工作原理,但似乎fn超出了范围。 - mncl
显示剩余4条评论

0

在函数内部,您可以使用变量arguments来查看传递了什么。例如:

function blah() {
   console.log(arguments);
}

blah(1, 2); // [1, 2]
blah([1, 2], [3]); // [[1,2], [3]]
blah(1, [2, 3], "string"); // [1, [2, 3], "string"]

问题恰好相反,我认为...如果不行的话,你能写出F会是什么样子吗? - mncl
你之前在问如何获取未知变量。答案是使用arguments变量。我不确定你还需要什么信息。 - Robert
我正在询问如何POST未知变量 - f()想要调用一个带有数组大小数量参数的函数。而不是读取未知数量的参数。 - mncl
那么使用数组大小数量的参数调用函数?我仍然不明白你的意思。 - Robert

0

您可以使用每个函数都有的arguments变量来遍历所有传入的参数。

function myConcat(separator) {  
   var result = ""; // initialize list  
   // iterate through arguments  
   for (var i = 1; i < arguments.length; i++) {  
      result += arguments[i] + separator;  
   }  
   return result;  
} 

请参阅this文章,了解关于可变数量参数的讨论。


嗯,我们都找到了同一篇文章!肯定是一个好的资源。 - NickAldwin

0

您可以在函数内部使用arguments伪数组来获取传递的参数,而无需显式声明它们(即,无论您是否为函数定义了一个参数,您都可以通过该函数内的arguments隐式变量访问传递给函数的所有内容)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接