首页 > 解决方案 > TypeError 的原因:对严格模式调用函数的访问被审查

问题描述

我正在开发一个使用 Angular 的 JMol Javascript 扩展的 Web 应用程序。这是具有挑战性的。它一直运行良好,但今天它停止在 Firefox 上运行。当我尝试某些东西时,JMol 抱怨错误

TypeError:访问严格模式调用函数被审查

这发生在 3rd 方代码中,仅在 Firefox(昨天已自行更新)上发生。它在 Chrome 上运行良好。

多年来,我发现有些人抱怨类似的错误(不使用 JMol)。他们都收到了有趣的答案——将 jQuery 降级到 1.1,包装了一些函数调用setTimeout和其他类似的答案。

我找不到此错误原因的解释。什么是严格模式调用者,哪些访问受到审查,为什么?我也很想看到在 Firefox 上生成此错误的最小代码片段 - 所以我可以理解我要修复的内容。

标签: javascriptfirefox

解决方案


正在发生的事情是,试图使用caller函数属性的代码被严格模式代码调用。例子:

function attemptToUseCaller() {
    console.log(attemptToUseCaller.caller.name);
}
function loose() {
    attemptToUseCaller();
}

function strict() {
    "use strict";
    attemptToUseCaller();
}
loose();
strict();

如果您在最新版本的 Firefox 中运行它,您将在控制台中看到:

松动的
TypeError:对严格模式调用函数的访问被审查

如您所见,attemptToUseCaller.caller调用函数处于松散模式时访问有效,但调用函数处于严格模式时访问失败。如果调用函数本身是严格的,则在严格模式下不允许访问该caller属性,甚至在“松散”代码中使用时也不允许访问该属性。Firefox 会引发特定错误,而使用 Chrome 的 V8 JavaScript 引擎,它只会在严格模式下返回值null.caller

使用caller是一种反模式。您需要分叉使用它的任何第 3 方代码并更正它。


推荐阅读