不考虑参数位置,将一个值传递给特定的参数

11

我想知道是否有可能通过指定参数名称来传递值,而不考虑此参数是第一个、第二个还是第100个。

例如,在Python中,您可以轻松地这样做:

def myFunction(x, y):
    pass

myFunction(y=3);

我需要将一个值传递给一个特定的参数,但我并不一定知道它在参数枚举中的位置。我已经搜索了一段时间,但似乎没有什么方法可行。


你仍然可以通过参数名称调用函数,假设它不是系统函数并且没有被最小化。你可以通过显式查看函数声明中的参数名称来实现。请参见我的带有可工作代码的答案。 - dimakura
JavaScript不是Python。如果您不关心顺序而只关心名称,请使用对象。而且,不要调用您完全不了解签名的函数。 - Bergi
@Bergi 谁说 JavaScript 是 Python 了?实际上,JavaScript 确实要糟糕得多(总体而言)。 - nbro
@Rinzler:你似乎希望它能像Python一样工作,但由于JavaScript不同(不讨论是否更好或更糟),它不会这样。命名参数违背了它的精神和 - 大多数时候 - 历史。 - Bergi
@Rinzler:是的,它更接近于JS中的typeof Number("NaN")(...其结果非常合理)。但是我发现float('nan')是缺失的NaN常量的最佳Python近似值。无论如何,我不是试图结束今天的工作吗? - Bergi
显示剩余3条评论
6个回答

13

不,JavaScript 中不存在命名参数。

有一种(某种程度上的)解决方法,通常较为复杂的方法可以将一个对象作为参数代替个别参数。

function doSomething(obj){
   console.log(obj.x);
   console.log(obj.y);
}

可以称之为

doSomething({y:123})

哪一个会先记录undefined(变量 x)然后是123(变量 y)。

你还可以将某些参数设为可选,并提供默认值:

function doSomething(obj){
   var localX = obj.x || "Hello World";
   var localY = obj.y || 999;
   console.log(localX);
   console.log(localY);
}

真遗憾。这个解决方案的问题在于我总是需要将所有参数作为对象属性传递... - nbro
不,不一定。请参考更新。你可以为那些“可选”的参数提供默认值。 - Jamiec

5

在JavaScript中,无法以这种方式传递参数。如果您需要这样做,最好将一个对象传递到您的函数中,并设置属性来表示要传递的参数:

function myFunction(p) {
    console.log(p.x);
    console.log(p.y);
}

myFunction({y:3});

3
function myFunction(parameters) {
  ...
  var x = parameters.myParameter;
}

myFunction({myParameter: 123});

2
我认为JavaScript中不存在这个功能。
替代的方法是:
function someFun(params) {
   var x = prams.x;
   ...
}

函数调用将会像这样

someFun({x: 5});

0
不,但你可以完全传递一个对象来实现这个目的。
var myFunction = function(data){
    console.log(data.foo); //hello;
    console.log(data.bar); //world;
}

myFunction({foo: 'hello', bar: 'world'});

编辑

否则,您的参数将按顺序而非名称接收。

var myFunction = function(foo, bar){
    console.log(foo); //bar;
    console.log(bar); //foo;
    //hyper confusing
}

var foo = 'foo',
    bar = 'bar';

//Passing the parametes out of order
myFunction(bar, foo);

0
在Javascript中没有命名参数。
但是假设您不调用系统或压缩函数,仍然可以通过参数名称来调用它。
以下是如何实现的一个想法:
function myFunction(x, y) { return x + y }

function invokeByParams(func, params) {
  var text = func.toString()
  var i1 = text.indexOf('(') + 1
  var i2 = text.indexOf(')')
  var args = text.substring(i1, i2).split(',')
  args = args.map(function(x) { return x.trim() })
  args = args.map(function(x) { return params[x.trim()] })
  return func.apply(this, args)
}

invokeByParams(myFunction, { y: 1, x: 2 }) // => 6

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