为什么在JavaScript中可以引用调用者中的参数

Why is it possible in JavaScript to refer to arguments in a caller?

本文关键字:调用者 参数 引用 JavaScript 为什么      更新时间:2023-09-26

什么机制允许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

如果您想捕捉错误并在自己的代码中计算它们,这可能会很有用,这样您就可以在集成输出中向最终用户澄清问题(或只是调试),或者将这些错误发送到服务器,以便您知道代码有问题。所有这些callerarguments的东西都可以帮助调试堆栈。它还可以帮助进行日志记录(同样是调试)、打印调用方函数的名称(可能还有它的参数)。或者你可以做一个深奥的程序,以某种方式有用地使用这些信息(可能在对象函数内部)。

为什么存在是因为这是语言的一部分(我认为为什么在这里不是一个好问题)。

您可以将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]);
}

但所有这些对我来说都没有太大的意义。你能澄清一下你想实现什么吗?