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

问题描述 投票:0回答:4

我自己正在学习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

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

javascript function ecmascript-6 javascript-function-declaration
4个回答
7
投票

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

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


3
投票

根据规格

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

21.b

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

因此,您的 JS 引擎确保如果其中一个参数具有默认值并且

hasDuplicates
为 true,那么它会抛出错误。


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


0
投票

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

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

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

“默认函数参数允许在没有传递值或未定义的情况下使用默认值初始化形式参数。” ES2015 中的默认参数

© www.soinside.com 2019 - 2024. All rights reserved.