使用数组定义Javascript参数名称

时间:2015-02-08 17:21:12

标签: javascript

我正在寻找一种通过数组定义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"

编辑:提供的解决方案很好,但没有解决问题,因为保留特定名称很重要。我有一个带有极长参数列表的函数,我宁愿将它们定义为一个数组,然后在实际的函数定义中。

5 个答案:

答案 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"