Bri*_*unt 20 javascript strict ecmascript-6
我正在尝试创建一个简单的调试函数,只显示函数的调用者,如下所示:
function xe() {
console.log(xe.caller().name)
}
Run Code Online (Sandbox Code Playgroud)
有了这个,我只能添加xe()一个函数,它将记录对函数的调用 - 只是一个简单的简单添加,以帮助调试.调试糖,可以这么说.
不幸的是我从主题行得到错误:
TypeError:'caller'和'arguments'是受限制的函数属性,在此上下文中无法访问.
我正在使用Babel/ES6,它注入"use strict"每个模块的顶部.这可能是原因,但搜索已经产生了有关错误引发原因的有限信息,我想更好地理解它.
如果严格模式是问题,我宁愿不为整个项目禁用严格模式 - 仅用于模块/功能.
Kit*_*nde 22
这是事业.来自MDN:
在严格模式下,不再可能通过常用的ECMAScript扩展来"遍历"JavaScript堆栈.在具有这些扩展的普通代码中,当函数fun被调用时,fun.caller是最近称为fun的函数,fun.arguments是调用fun的参数.这两个扩展对于"安全"JavaScript都是有问题的,因为它们允许"安全"代码访问"特权"函数及其(可能是不安全的)参数.如果fun是严格模式,fun.caller和fun.arguments都是不可删除的属性,在设置或检索时抛出:
如果你正在做ES6,你不能在一般情况下禁用严格模式.它在某些条件下是隐含的,例如在ES6模块中.
如果您只是调试,我建议只在调试器中使用断点并检查堆栈帧,但我相信您已经知道了.
如果您只是输出调试信息,我想也可以读取Error对象的堆栈:
console.log(new Error().stack);
Run Code Online (Sandbox Code Playgroud)
您可以使用以下两者之一进行全局禁用(但我意识到这不是您想要的)use strict
require("6to5").transform("code", { blacklist: ["useStrict"] });
Run Code Online (Sandbox Code Playgroud)
要么
$ 6to5 --blacklist useStrict
Run Code Online (Sandbox Code Playgroud)
如果你必须在模块级别上剥离它,我怀疑你必须自己做.基本字符串替换也许?
此外,正如ES5中所指出的那样.它应该是xe.caller.name或不是,xe.caller().name或者您将重新调用该函数.
| 归档时间: |
|
| 查看次数: |
26829 次 |
| 最近记录: |