我自己在学习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
然后它不再工作了。它为第一个方程而不是第二个方程的背后的逻辑是什么?
答案 0 :(得分:6)
ES2015(该语言的最新稳定规范)允许使用默认值声明参数。当您这样做时,该语言不允许您重复使用参数名称。
当您没有执行任何参数默认设置时,该语言允许旧的"马虎"重用参数名称。如果启用" strict"模式解释,你的第一个例子也会出错。
答案 1 :(得分:2)
根据spec
- 如果parameterNames有任何重复条目,请将hasDuplicates设为true。否则,让hasDuplicates为false。
醇>21.b
注意早期错误确保只能出现重复的参数名称 在非严格函数中没有参数默认值或 休息参数。
因此,您的JS引擎可确保如果其中一个参数具有默认值且hasDuplicates
为true,则会引发错误。
答案 2 :(得分: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
答案 3 :(得分:0)
参数名称必须是唯一的;如果你为两个参数使用相同的名称,然后解释器会混淆你想要访问的那个;
您在代码中添加了相同的评论
//Firebug error - SyntaxError: duplicate argument names not allowed in this context
“如果没有传递值或未定义,则默认函数参数允许使用默认值初始化形式参数。” ES2015中的Default parameter