具有相同参数的 Javascript 函数声明

Posted

技术标签:

【中文标题】具有相同参数的 Javascript 函数声明【英文标题】:Javascript function declaration with same arguments 【发布时间】:2016-07-08 00:05:33 【问题描述】:

我自己也在学习 javascript。我发现如果我声明一个具有相同参数的函数,它就可以正常工作:

function func(a, b, a)
  return b;

alert(func(1,2,3));

但如果我这样做:

function func(a, b, a = 5)
  return b;

alert(func(1,2,3)); 
//Firebug error - SyntaxError: duplicate argument names not allowed in this context

然后它不再工作了。它适用于第一个方程但不适用于第二个方程的逻辑是什么?

【问题讨论】:

您应该尝试对这些使用严格模式。 JSFiddle 【参考方案1】:

根据MDN,这种检查是由JS在内部完成的,以防出现默认情况

function go() 
  return ":P"


function withDefaults(a, b = 5, c = b, d = go(), e = this, 
                      f = arguments, g = this.value) 
  return [a,b,c,d,e,f,g];

function withoutDefaults(a, b, c, d, e, f, g)
  switch(arguments.length)
    case 0:
      a
    case 1:
      b = 5
    case 2:
      c = b
    case 3:
      d = go();
    case 4:
      e = this
    case 5:
      f = arguments
    case 6:
      g = this.value;
    default:
  
  return [a,b,c,d,e,f,g];


withDefaults.call(value:"=^_^=");
// [undefined, 5, 5, ":P", value:"=^_^=", arguments, "=^_^="]


withoutDefaults.call(value:"=^_^=");
// [undefined, 5, 5, ":P", value:"=^_^=", arguments, "=^_^="]

现在你的情况是这样的 -

case 0:
    a
case 1:
    b
case 2:
    a = a

但是在执行案例 2 时,a 仍然没有定义,因此它在错误情况下通过。

在此处查看详细信息https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/default_parameters

【讨论】:

【参考方案2】:

ES2015(该语言的最新稳定规范)允许使用默认值声明参数。当您这样做时,该语言将不允许您重复使用参数名称。

当您不使用任何参数默认值时,该语言允许旧的“草率”重用参数名称。如果启用“严格”模式解释,第一个示例也会出现错误。

【讨论】:

但是进入严格模式我可以两次声明同一个变量(我刚刚测试过)。但它不允许函数参数相同。 @Marymon 是的,没错。冗余的var 声明是允许的,我怀疑是因为太多旧代码会破坏,而且因为(感谢var 的语义)它们并没有真正伤害任何东西。 JavaScript 有着悠久而奇怪的历史,其中有很多看起来不一致的地方。 本质上是undefined 变量在内部被分配给其他undefined 变量问题。【参考方案3】:

参数名称必须是唯一的;如果您对两个参数使用相同的名称,然后解释器会混淆您要访问哪一个;

与您在代码中添加的注释相同

//Firebug error - SyntaxError: duplicate argument names not allowed in this context

“如果没有传递任何值或未定义,则默认函数参数允许使用默认值初始化形式参数。” Default parameter 在 ES2015 中

【讨论】:

【参考方案4】:

根据spec

    如果 parameterNames 有任何重复条目,则让 hasDuplicates 为真。否则,让 hasDuplicates 为 false。

21.b

注意 早期错误确保只会出现重复的参数名称 在没有参数默认值的非严格函数中或 其余参数。

因此,您的 JS 引擎会确保如果其中一个参数具有默认值且 hasDuplicates 为 true,则它会引发错误。

【讨论】:

以上是关于具有相同参数的 Javascript 函数声明的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中声明具有动态参数的函数 [重复]

全新Java入门到架构师教程之JavaScript函数定义函数参数和调用

javascript 函数初探

七JavaScript函数

JavaScript 第4天学习规划丨函数

如何在 JavaScript 中使用循环函数声明变量 x1、x2、...、x10?