javascript - "arguments"对象在内部是如何工作的?

标签 javascript v8

如下面的 JS 片段所示,arguments[0]a 始终保持相同的值。这在 JS 中是众所周知的,但我仍然很好奇这是如何实现的。

例如,如果 aarguments[0] 都引用同一个 JS 对象,那么它们总是获得更新的值是可以理解的。但这不能解释像 1 这样的原始值的情况。

如果我理解正确,JS 总是复制原语的值,这意味着 aobject[0] 都持有该值的副本。如果是这种情况,aarguments[0] 如何始终同步?

function func(a, b) {

  console.log("a = " + a);
  console.log("arguments[0] = " + arguments[0]);

  arguments[0] = 123;
  console.log("a = " + a);
  console.log("arguments[0] = " + arguments[0]);

  a = 123456;
  console.log("a = " + a);
  console.log("arguments[0] = " + arguments[0]);
}

func(1, 2);

这是输出:

>node test.js
a = 1
arguments[0] = 1
a = 123
arguments[0] = 123
a = 123456
arguments[0] = 123456

最佳答案

arguments 对象很特殊,它与 Javascript 实现存储函数参数的方式 Hook 。因此,当您分配给 arguments[n] 时,它实际上会找到用于保存参数变量的内存块,并将您分配的值放在那里。当按名称引用参数变量时,也会使用相同的内存位置。

另一种思考方式是每个函数都有一个本地arguments 类数组对象。当 JS 实现编译函数定义时,它将所有参数变量替换为对该数组的引用。所以使用 a 的表达式被编译为好像它们使用了 arguments[0]b 被翻译成 arguments[1] ,等等。

关于javascript - "arguments"对象在内部是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38275455/

相关文章:

JavaScript:为什么 "for in"循环从 __proto__ 中选取变量?

javascript - 如何将 HTML ID 链接与 Bootstrap 导航栏标题一起使用?

javascript - 有用的 Node.js 中间件

javascript - 类型错误 : 'ownKeys' on proxy: trap result did not include 'arguments'

javascript - const 与内联字符串文字,编译优化

javascript - 通过单击按钮保存项目变量

javascript - 两个网页之间的滑动过渡动画

javascript - 在单元格上的两篇论文之间拖放 - JointJs

c++ - 如何在没有 OO 的情况下关联值(value)和功能

javascript - 这是使用 nodejs 的好场景吗?