“调用方”和“参数”是受限制的函数属性,在这种情况下无法访问

布莱恩·亨特:

我正在尝试创建一个简单的调试函数,该调试函数仅显示函数的调用者,如下所示:

function xe() {
  console.log(xe.caller().name)
}

有了这个,我将能够添加xe()到一个函数中,它将记录对该函数的调用-只是一个简短,简单的添加,以帮助进行调试。可以说调试糖。

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

TypeError:“ caller”和“ arguments”是受限制的函数属性,在此上下文中无法访问。

我正在使用Babel / ES6,它会插入"use strict"每个模块的顶部。可能是原因,但是搜索对于产生该错误的原因提供的信息有限,我想更好地理解它。

如果出现严格模式的问题,我宁愿不要对整个项目(仅对模块/功能)禁用严格模式。

套件健康:

这是原因。从MDN

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

如果您正在使用ES6,则通常不能禁用严格模式。某些条件下(例如在ES6模块中),它是隐式的

如果您只是调试,建议您在调试器中使用一个断点并检查堆栈框架,但是我确定您已经知道了。

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

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

您可以使用babel 全局禁用(但我意识到这不是您想要的)use strict使用以下任一方法:

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

要么

$ 6to5 --blacklist useStrict

如果您必须在模块级别上将其剥离,我怀疑您必须自己进行操作。基本的字符串替换?

此外,正如ES5中指出的那样。应该是xe.caller.namexe.caller().name否则应该重新调用该功能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我怎么能在这种情况下正确调用构造函数?

默认情况下,Spring Reactor中的订阅者是否不受限制?

如何在不超出限制的情况下使用受限制的API?

在这种情况下如何不重复自己?相同但参数不同的C函数

在这种情况下,wasm编译超出了内部限制(提供的参数)

属性“ fallthrough”不能在这种情况下应用

AJAX错误:TypeError:在这种情况下无法访问“参数”,“被调用者”和“调用者”

在这种情况下,溢出-自动无法正常工作

错误:在调用FirefoxDriver和Firefox时,发现参数'-m'不是预期的,或者在这种情况下无效

为什么在这种情况下无法合并接口?

在这种情况下,Java Queue无法存储Integer

在这种情况下如何使用“和”“如果”

在这种情况下无法访问,因为它是朋友

为什么在这种情况下引用模板参数?

在这种情况下如何访问特定的JSON数据?

在这种情况下如何访问可选参数?

||之间的差异 和|| =在这种情况下

在这种情况下,如何设置setInterval()和removeInterval()?

在这种情况下,无法区分内部元素和外部元素

Bash-在这种情况下如何调用函数

为什么在这种情况下没有调用最合适的构造函数?

实施Quicksort以对列表进行排序(对列表内容的访问权限受限制/无法访问)

在这种情况下无法使Perl Pack正常工作

如何在不完全限制ssh访问的情况下拥有受限制的ssh用户?

在这种情况下,无法升级nodejs

在这种情况下无法获得布尔值

在这种情况下使用 includes() 函数

在这种情况下,您如何从减速器/动作正确调用函数?

在这种情况下如何访问变量?