Javascript:功能的“无限”参数?

时间:2012-02-18 03:35:54

标签: javascript function parameters infinite

在Chrome中,当我在下面的一个中输入console.log时:

console.log("A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter");

...它正确打印,没有错误或警告。我添加了更多参数,但仍然可以正确打印出来。

console.log("A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter", "A parameter");

我怎样才能拥有一个“无限”参数功能呢?

3 个答案:

答案 0 :(得分:50)

函数可以访问名为arguments的类似数组的对象,该对象包含它们收到的所有参数

function print_my_arguments(/**/){
    var args = arguments;
    for(var i=0; i<args.length; i++){
        console.log(args[i]);
    }
};

你可以使用apply方法进行相反的转换(调用给定参数列表的函数):

// These are equivalent:
print_my_arguments(1,2,3);
print_my_arguments.apply(null, [1,2,3]);

// The first parameter to `apply` is the `this`.
// It is used when the function is a method.
foo.bar(1,2,3);
var f = foo.bar; f.apply(foo, [1,2,3]);

需要注意的一些要点:

  1. arguments不是一个实际的数组,它没有通常的数组方法(切片,连接等)。您可以使用以下行将其转换为数组:

    var args = Array.prototype.slice.call(arguments);
    
  2. 如果您希望数组仅包含已收到的非命名参数,则切片也很有用:

    function foo(first_arg, second_arg /**/){
        var variadic_args = Array.prototype.slice.call(arguments, 2);
    }
    
  3. 并非每个浏览器都可以处理任意数量的函数参数。上次我测试了这个,在Chrome和IE中有一些堆栈溢出后,有200.000个参数。如果您的函数可以接收任意大量的参数,请考虑将所有这些参数打包在常规数组中。

  4. 出现在我的示例的参数列表中的那些/**/注释不是必需的。它们只是一种编码惯例,用于标记我的可变参数函数并将它们与常规函数区分开来。

    // A quick glance would suggest that this function receives no
    // parameters but actually it is a variadic function that gets
    // its parameters via the `arguments` object.
    function foo(){
        console.log(arguments.length);
    }
    

答案 1 :(得分:2)

现代的做法是使用rest parameters

function printArguments(...args) {
  args.forEach((arg, index) => {
    console.log(`Argument ${index}:`, arg);
  });
}

printArguments('hello', true, new Date());

通过使用...args语法,所有参数都保存在名为args的数组中。

除了Internet Explorer之外,所有浏览器都已在其最新版本中提供此功能。

小提琴:https://jsfiddle.net/Lbf0stst/

答案 2 :(得分:0)

您可以使用参数数组:jsfiddle.net/kUnJ2/

function foo() {
    for (var i = 0; i < arguments.length; i++) {
        document.body.innerHTML += arguments[i];
    }
}


foo("There ", "are ", "as ", "much ", "arguments ", "as ", "you ", "want.");