为什么在JavaScript中可以引用调用者中的参数
Why is it possible in JavaScript to refer to arguments in a caller?
什么机制允许JavaScript函数通过调用函数的名称从调用方引用arguments
?为什么它仍然在该语言中?
我在V8中查找尾部调用优化(或者更确切地说是缺乏优化),发现了这篇文章(https://code.google.com/p/v8/issues/detail?id=457)
Erik Corry的例子如下
function foo(x) {
return bar(x + 1);
}
function bar(x) {
return foo.arguments[0];
}
foo(1)
起初,我认为调用一个函数可能会将其arguments
字段设置为某种奇怪的全局副作用,但它似乎只会持续调用的持续时间。
function foo(x) {
return bar(x+1);
}
function bar(x) {
return foo.arguments[0];
}
console.log(foo(1)); // prints '1'
console.log(foo.arguments); // prints 'null'
为什么这种行为会出现在语言中?除了向后兼容性之外,它还有用吗?
编辑:
我不是在问使用arguments
来引用当前函数体中的伪参数数组,例如
function variadic() {
for (var i = 0; i < arguments.length; i++) {
console.log("%s-th item is %s", i, JSON.stringify(arguments[i]));
}
}
variadic(1, 2, 3, 4, 5, []);
我询问使用somefunction.arguments
来指代呼叫者的arguments
。
如果您想捕捉错误并在自己的代码中计算它们,这可能会很有用,这样您就可以在集成输出中向最终用户澄清问题(或只是调试),或者将这些错误发送到服务器,以便您知道代码有问题。所有这些caller
和arguments
的东西都可以帮助调试堆栈。它还可以帮助进行日志记录(同样是调试)、打印调用方函数的名称(可能还有它的参数)。或者你可以做一个深奥的程序,以某种方式有用地使用这些信息(可能在对象函数内部)。
为什么存在是因为这是语言的一部分(我认为为什么在这里不是一个好问题)。
您可以将arguments
变量传递给被调用的函数:
function foo(x) {
return bar(x+1, arguments);
}
function bar(x, foo_arguments) {
return foo(foo_arguments[0]);
}
或者将该变量放在全局变量上:
var args = false;
function foo(x) {
args = arguments;
return bar(x+1);
}
function bar(x) {
return foo(args[0]);
}
编辑:
或者使用函数的caller
属性:
function foo(x) {
return bar(x+1);
}
function bar(x) {
return foo(bar.caller.arguments[0]);
}
但所有这些对我来说都没有太大的意义。你能澄清一下你想实现什么吗?
相关文章:
- 用javascript记录传递给回调的参数的约定是什么
- 在Javascript中向回调添加参数
- 你能调用一个在调用者上下文中返回的函数吗
- sinon.js验证mock方法's带回调的参数
- Web Worker postMessage({})何时返回给调用者
- 将回调作为参数传递给函数
- 正在向传递的回调添加参数
- 当javascript是单线程时,谁是onreadystatechange的调用者
- jQuery插件回调函数参数
- 向回调添加参数
- 猫鼬的回调()参数错误无效
- 函数调用者无效元素
- Javascript - make 函数在函数完成时告诉调用者
- 访问它外部的回调函数参数的简单方法是什么
- Javascript:如何获取回调的参数
- 用被调用者的尾部调用函数'的参数列表
- 为什么在JavaScript中可以引用调用者中的参数
- 将参数传递给回调函数时,与回调函数的调用者发生冲突
- JS Flow:如何将参数传递给回调而不传递给调用者
- & # 39;调用者# 39;和& # 39;参数# 39;是受限制的函数属性,不能在此上下文中访问