& # 39;调用者# 39;和& # 39;参数# 39;是受限制的函数属性,不能在此上下文中访问

'caller' and 'arguments' are restricted function properties and cannot be accessed in this context

本文关键字:不能 访问 上下文 调用者 参数 函数 受限制 属性      更新时间:2023-09-26

我正在尝试创建一个简单的调试函数,它只显示函数的调用者,像这样:

function xe() {
  console.log(xe.caller().name)
}
有了这个,我就可以将xe()添加到一个函数中,它将记录对该函数的调用-只是一个简短的,简单的添加,以帮助调试。可以这么说,调试糖

不幸的是,我从主题行得到了错误:

TypeError: 'caller'和'arguments'是受限制的函数属性,不能在此上下文中访问。

我使用Babel/ES6,它在每个模块的顶部注入"use strict"。这个可能是原因,但是搜索得到的关于错误产生原因的信息有限,我想更好地理解它。

如果严格模式是问题,我宁愿不禁用严格模式为整个项目-只是为模块/功能。

这是原因。从MDN:

在严格模式下,不再可能通过对ECMAScript的通用实现扩展来"遍历"JavaScript堆栈。在这些扩展的正常代码中,当函数fun正在被调用时,fun。Caller是最近调用fun的函数。参数是调用乐趣的参数。这两个扩展对于"安全"JavaScript来说都是有问题的,因为它们允许"安全"代码访问"特权"函数及其(可能不安全的)参数。如果乐趣处于严格模式,那么两者都是乐趣。来电者和乐趣。参数是不可删除的属性,在设置或检索时抛出:

如果你使用的是ES6,一般情况下你不能禁用严格模式。在某些情况下,例如在ES6模块中,它是隐式的。

如果你只是在调试,我建议在调试器中使用断点并检查堆栈帧,但我相信你已经知道了。

如果你只是输出调试信息,你也可以,我想只是读取一个Error对象的堆栈:

console.log(new Error().stack);

你可以全局禁用(但我意识到这不是你想要的)use strict与babel使用:

require("6to5").transform("code", { blacklist: ["useStrict"] });

$ 6to5 --blacklist useStrict

如果你必须在模块级别上剥离它,我怀疑你必须自己做。也许可以替换基本的字符串?

此外,正如ES5中指出的那样。它应该是xe.caller.name而不是xe.caller().name,否则您将重新调用该函数。

按照本文档。Function.caller()属性返回调用指定函数的函数。简单地说,当您使用xe.caller时,您将获得整个调用函数。你再次执行调用函数。这里您正在执行递归,这就是在严格模式下不允许的原因。

您可以在浏览器控制台中执行示例函数。你会得到Maximum call stack size exceeded错误