观察:
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会以这种方式运行?
答案 0 :(得分:17)
在使用其值之前,您将覆盖第一个参数:
arg1 = "Default"; // Set arg1 to some default value
arg2 = arguments[0]; // Use the first argument passed for arg2
因此arg2
的值设置为值“Default”而不是原始值。
答案 1 :(得分:5)
尝试在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];
}
答案 2 :(得分:3)
这是the spec:
的一部分对于非严格模式函数,数组索引(在15.4中定义)命名 数据名称值为的参数对象的数据属性 小于相应的形式参数的数量 函数对象最初与相应的共享它们的值 函数执行上下文中的参数绑定。 这意味着 更改属性会更改参数的相应值 绑定,反之亦然。如果发生这种情况,这种通信就会被打破 删除属性,然后重新定义或更改属性 进入一个访问者财产。对于严格模式函数,其值为 arguments对象的属性只是参数的副本 传递给函数,之间没有动态联系 属性值和形式参数值。
请注意,如果您"use strict";
,您的功能会按预期工作。