什么样的机制允许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东西都可以帮助调试堆栈。它还可以帮助记录日志(再次调试内容),打印调用方函数的名称(以及可能的参数)。
或者,您可以编写一个深奥的程序,以某种方式有用地使用此信息(也许在对象函数内部)。

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

关于javascript - 为什么在JavaScript中可以在调用方中引用参数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34122440/

10-12 12:28
查看更多