Javascript ';呼叫者';和';参数';是受限制的函数属性,无法在此上下文中访问

Javascript ';呼叫者';和';参数';是受限制的函数属性,无法在此上下文中访问,javascript,ecmascript-6,strict,Javascript,Ecmascript 6,Strict,我试图创建一个简单的调试函数,它只显示函数的调用方,如下所示: function xe() { console.log(xe.caller().name) } 有了它,我就可以将xe()添加到一个函数中,它将记录对该函数的调用——这只是一个简短的、简单的添加,有助于调试。可以说是糖 不幸的是,我从主题行中得到了错误: TypeError:“调用者”和“参数”是受限制的函数属性,无法在此上下文中访问 我使用的是Babel/ES6,它在每个模块的顶部注入了“use strict”。这可能是原因

我试图创建一个简单的调试函数,它只显示函数的调用方,如下所示:

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

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

TypeError:“调用者”和“参数”是受限制的函数属性,无法在此上下文中访问

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

如果严格模式是问题所在,我不希望对整个项目禁用严格模式–只针对模块/功能。

这就是原因:

在严格模式下,不再可能通过ECMAScript的常用扩展来“遍历”JavaScript堆栈。在具有这些扩展的普通代码中,当函数的乐趣处于调用的中间时,Fun.Calor是最近被称为Fun的函数,Fun.For是用于调用该函数的参数。这两个扩展对于“安全”JavaScript都有问题,因为它们允许“安全”代码访问“特权”函数及其(可能不安全)参数。如果fun处于严格模式,则fun.caller和fun.arguments都是不可删除的属性,在设置或检索时抛出:

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

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

如果只是输出调试信息,也可以读取错误对象的堆栈:

console.log(new Error().stack);
你可以(但我意识到这不是你想要的)
使用strict
和babel一起使用:

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

如果您必须在模块级别上进行剥离,我怀疑您必须自己进行。基本字符串是否可以替换

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

Function.caller()
属性返回调用指定函数的函数。当您使用
xe.caller
时,您将获得整个调用函数。同样,您正在执行调用者函数。这里您正在执行递归,这就是它不允许在严格模式下执行的原因


您可以在浏览器控制台中执行示例函数。您将得到超过最大调用堆栈大小的
错误。

您真的想调用您的
。调用方
?请参见每个模块顶部的和
“使用严格”
$ 6to5 --blacklist useStrict