参数对象如何在内部工作?

时间:2016-07-08 21:11:56

标签: 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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

arguments 对象是一个类似于Array的对象,对应于传递给函数的参数。”来自MDN: Arguments object

为了简单起见,请考虑一下。

function func(a, b) {
  // imagine this line of code gets automatically added
  // var arguments = [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]);
}