在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");
我怎样才能拥有一个“无限”参数功能呢?
答案 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]);
需要注意的一些要点:
arguments
不是一个实际的数组,它没有通常的数组方法(切片,连接等)。您可以使用以下行将其转换为数组:
var args = Array.prototype.slice.call(arguments);
如果您希望数组仅包含已收到的非命名参数,则切片也很有用:
function foo(first_arg, second_arg /**/){
var variadic_args = Array.prototype.slice.call(arguments, 2);
}
并非每个浏览器都可以处理任意数量的函数参数。上次我测试了这个,在Chrome和IE中有一些堆栈溢出后,有200.000个参数。如果您的函数可以接收任意大量的参数,请考虑将所有这些参数打包在常规数组中。
出现在我的示例的参数列表中的那些/**/
注释不是必需的。它们只是一种编码惯例,用于标记我的可变参数函数并将它们与常规函数区分开来。
// 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之外,所有浏览器都已在其最新版本中提供此功能。
答案 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.");