“参数”对象如何在内部工作
How does the "arguments" object work internally?
如下面的JS代码片段所示,arguments[0]
和a
始终保持相同的值。这在 JS 中是众所周知的,但我仍然很好奇它是如何实现的。
例如,如果a
和arguments[0]
都引用同一个 JS 对象,则它们始终获得更新的值是可以理解的。但这不能解释像 1 这样的原始值的情况。
如果我理解正确,JS总是复制原语的值,这意味着a
和object[0]
都持有该值的副本。如果是这种情况,a
和arguments[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实现存储函数参数的方式挂钩。因此,当您分配给 arguments[n]
时,它实际上会找到用于保存参数变量的内存块,并将您正在分配的值放在那里。在按名称引用参数变量时,也会使用相同的内存位置。
另一种思考方式是每个函数都有一个类似数组的本地arguments
对象。当 JS 实现编译函数定义时,它会将所有参数变量替换为对该数组的引用。因此,使用 a
的表达式被编译为使用arguments[0]
,b
被转换为 arguments[1]
,依此类推。
"参数对象是一个类似数组的对象,对应于传递给函数的参数。 来自 MDN: 参数对象
为了简单起见,想想就知道了。
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]);
}
相关文章:
- JS Promises如何在内部工作
- 为什么更改范围获胜'不能在ng if内部工作,而是通过函数调用AngularJS
- CSS和Javascript可以在内部服务器上工作,但不能在外部工作
- 无法获得控制台.log在 CasperJS 中评估内部工作
- Javascript Array Push 代码如何在内部工作
- jQuery Content Switcher (无法使联系人表单在内部工作)
- GetVariable在方法内部工作
- Br在使用Jquery.html()时无法在P内部工作
- 颜色框代码在Umbraco外部工作,但在内部不工作
- yeoman生成器:复制或模板dos'不能在异步回调内部工作
- 代码在主页中工作,但不在内部目录中工作 - 仅显示加载
- 了解$.proxy如何在内部工作
- 为什么$(this)选择器在我的函数内部工作,而在外部工作
- canvas.width=canvas.width如何在内部工作
- 引导模式工作在内部页面,但不工作在主页
- setInterval只在if(){}块内部工作
- Jquery不能在函数内部工作
- Jquery平滑滚动只在内部工作
- Javascript在内部工作,而不是在外部
- “参数”对象如何在内部工作