观察:
function myFunc(arg1, arg2) {
if (arguments.length < 2) { // Only one argument received
arg1 = "Default"; // Set arg1 to some default value
arg2 = arguments[0]; // Use the first argument passed for arg2
}
return [arg1, arg2];
}
myFunc("Hello", "World"); //=> ["Hello", "World"]
// So far, so good. Now let's try one that uses the default value for arg1:
myFunc("World"); //=> ["Default", "Default"]
JavaScript 到底是什么?这是怎么回事?为什么 JavaScript 会有这样的行为?
在使用第一个参数的值之前,您将覆盖它:
arg1 = "Default"; // Set arg1 to some default value
arg2 = arguments[0]; // Use the first argument passed for arg2
因此
arg2
的值设置为值“默认”而不是原始值。
尝试切换 if 语句中的逻辑:
function myFunc(arg1, arg2) {
if (arguments.length < 2) { // Only one argument received
arg2 = arguments[0]; // Use the first argument passed for arg2
arg1 = "Default"; // Set arg1 to some default value
}
return [arg1, arg2];
}
它是规范的一部分:
对于非严格模式函数,数组索引(在 15.4 中定义)命名为 参数对象的数据属性,其数字名称值为 小于相应的形式参数的数量 函数对象最初与相应的函数对象共享它们的值 函数执行上下文中的参数绑定。 这意味着 更改属性会更改参数的相应值 绑定,反之亦然。 如果这样一个对应关系就被破坏了 属性被删除然后重新定义或者属性被更改 进入访问器属性。对于严格模式函数,值 参数对象的属性只是参数的副本 传递给函数并且之间没有动态链接 属性值和形式参数值。
请注意,如果您
"use strict";
,您的函数将按预期工作。