我正在玩ES6默认参数,我有一个奇怪的行为。
以下是问题的一个简短示例:
function test(firstValue, secondValue=5){
console.log("firstValue: " + firstValue);
console.log("secondValue: " + secondValue);
console.log("----------")
}
test(2, secondValue = 3)
test(secondValue = 3)
及其输出:
firstValue: 2
secondValue: 3
----------
firstValue: 3
secondValue: 5
----------
在第二种情况下,我预计firstValue: undefined
和secondValue: 3
。这种行为是否正常。我想念一下吗?
答案 0 :(得分:5)
当你这样做时
test(2, secondValue = 3)
你实际上是这样做的:
secondValue = 3
test(2, 3)
由于The Horror of Implicit Globals,第一部分(secondValue = 3
)创建了一个名为secondValue
的全局变量。*它与函数中的secondValue
参数无关。 JavaScript没有命名参数。 (例如,你不能说'#34;这里是secondValue
"的值,除非把它放在参数列表中的正确位置,否则进行调用。如果你想要在进行调用时指定名称,可以使用解构为cubbuk points out,这不是真正命名的参数,但可以用于相同的目的。)
第二部分(将3
传递给test
)的发生是因为作业的结果是指定的值(因此secondValue = 3
将secondValue
设置为{{1}然后输入值3
,然后将其传递到3
)。
要test
为test
致3
,请执行此操作。 E.g:
secondValue
如果要关闭第二个,将使用默认值:
test(2, 3);
示例:
test(2);

* (这是我贫穷的小博客上的帖子)
答案 1 :(得分:1)
您正在使用全局变量而未声明它。赋值生成一个全局变量,不会影响函数test
的变量。这些局部变量与调用范围无关。
function test(firstValue, secondValue=5){
console.log("firstValue: " + firstValue);
console.log("secondValue: " + secondValue);
console.log("----------")
}
var secondValue; // with declaration
console.log(secondValue);
test(2, secondValue = 3)
test(secondValue = 3)
console.log(secondValue);
答案 2 :(得分:1)
你想做解构我猜:
function test({firstValue, secondValue = 5} = {}){
console.log("firstValue: " + firstValue);
console.log("secondValue: " + secondValue);
console.log("----------")
}
test() // prints firstValue: undefined, secondValue: 5
test({}) // prints firstValue: undefined, secondValue: 5
test({firstValue: 2}) // prints firstValue: 2, secondValue: 5
test({secondValue: 3}) // prints firstValue: undefined, secondValue: 3