为什么修改函数参数也会修改 `arguments` 对象?

问题描述 投票:0回答:3

观察:

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 会有这样的行为?

javascript arguments
3个回答
17
投票

在使用第一个参数的值之前,您将覆盖它:

arg1 = "Default"; // Set arg1 to some default value
arg2 = arguments[0]; // Use the first argument passed for arg2

因此

arg2
的值设置为值“默认”而不是原始值。


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];
}

3
投票

它是规范的一部分

对于非严格模式函数,数组索引(在 15.4 中定义)命名为 参数对象的数据属性,其数字名称值为 小于相应的形式参数的数量 函数对象最初与相应的函数对象共享它们的值 函数执行上下文中的参数绑定。 这意味着 更改属性会更改参数的相应值 绑定,反之亦然。 如果这样一个对应关系就被破坏了 属性被删除然后重新定义或者属性被更改 进入访问器属性。对于严格模式函数,值 参数对象的属性只是参数的副本 传递给函数并且之间没有动态链接 属性值和形式参数值。

请注意,如果您

"use strict";
,您的函数将按预期工作。

© www.soinside.com 2019 - 2024. All rights reserved.