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

Javascript function declaration with same arguments

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

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

根据 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

但是在执行case 2的时候,a还是没有定义,所以在error scenario中通过了。

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

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

当您不进行任何参数默认设置时,该语言允许重新使用旧的 "sloppy" 参数名称。如果您启用 "strict" 模式解释,您的第一个示例也会出现错误。

Argument name must be unique; if you use same name for two arguments and then interpreter get confuses which one you want to access;

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

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

"Default function parameters allow formal parameters to be initialized with default values if no value or undefined is passed." Default parameter in ES2015

根据 spec

  1. If parameterNames has any duplicate entries, let hasDuplicates be true. Otherwise, let hasDuplicates be false.

21.b

NOTE Early errors ensure that duplicate parameter names can only occur in non-strict functions that do not have parameter default values or rest parameters.

因此,您的 JS 引擎确保如果其中一个参数具有默认值并且 hasDuplicates 为真,那么它会抛出错误。