我正在寻找一种通过数组定义javascript函数参数的方法,以便例如以下代码可以工作。有可能吗?
args = ["foo", "bar"]
func = function(???) { //not sure what (if anything) could go here to make it work
console.log(foo)
console.log(bar)
}
func (5, "good times") // logs "5" and "good times"
编辑:提供的解决方案很好,但没有解决问题,因为保留特定名称很重要。我有一个带有极长参数列表的函数,我宁愿将它们定义为一个数组,然后在实际的函数定义中。
答案 0 :(得分:1)
在函数内部,参数可通过名为arguments
的特殊对象:
function magic() {
for (var i = 0; i < arguments.length; ++i)
console.log(arguments[i]);
}
magic("hello", "world"); // two console entries, "hello" and "world"
arguments
对象就像一个数组,但它有所不同。如果性能很重要,请务必小心使用它,因为对象有一些不寻常的属性会导致现代JavaScript优化器出现问题。
在进行函数调用之后,无法为参数赋予名称,但是(如果您真的想要)可以创建一个对象并将参数复制到其中:
function weird() {
var parameters = {};
for (var i = 0; i < arguments.length; ++i)
parameters["arg" + i] = arguments[i];
// ...
}
答案 1 :(得分:0)
你可以传递一个数组并使用for
循环遍历数组的值:
func = function(array) {
for(var i=0; i<array.length; i++){
console.log(array[i]);
}
}
答案 2 :(得分:0)
也许您正在寻找允许您将一系列参数作为数组传递的.apply()
方法,并在调用函数时将它们解压缩为普通参数。
var args = ["foo", "bar"];
var func = function() {
// any arguments pass to the function can be accessed via
// the arguments pseudo-array
console.log(arguments[0]); // "foo"
console.log(arguments[1]); // "bar"
}
func.apply(null, args);
或者,您仍然可以在函数声明中声明参数的名称:
var args = ["foo", "bar"];
var func = function(arg1, arg2) {
console.log(arg1); // "foo"
console.log(arg2); // "bar"
}
func.apply(null, args);
如果您想要调用者设置传递的名称的命名参数,您可以将对象传递给函数:
var args = {foo: "goodbye", bar: "hello"};
var func = function(options) {
console.log(options.foo); // "goodbye"
console.log(options.bar); // "hello"
}
func(args);
答案 3 :(得分:0)
看起来你正在寻找关键字参数,比如python:
# define a func
def func(foo, bar):
....
# call it
func(bar=123, foo=456)
Javascript(从ES5开始)并不提供这种语法,它通常使用对象进行模拟:
function func(args) {
console.log(args.foo);
console.log(args.bar);
}
// call it
func({
bar: 123,
foo: 456
});
答案 4 :(得分:0)
受@ pointy的回答启发,我提出了一种方法来做到这一点,尽管it does pollute the global namespace a bit。
args = ["foo", "bar"]
func = function() {
for (i = 0, len = args.length; i < len; i = ++i) {
arg = args[i];
window[arg] = arguments[i];
}
console.log(foo)
console.log(bar)
}
func (5, "good times") // logs "5" and "good times"