【问题标题】:The cause for TypeError: access to strict mode caller function censoeredTypeError 的原因:对严格模式调用函数的访问被审查
【发布时间】:2018-09-17 12:45:02
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: javascript firefox


【解决方案1】:

发生的情况是,试图使用函数的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 引擎,它只会在严格模式下为 .caller 返回值 null

使用caller 是一种反模式。您需要派生任何正在使用它的第 3 方代码并进行更正。

【讨论】:

  • 好的,知道了,谢谢。更改第 3 方代码将是一件非常痛苦的事情,因为它部分是从 Java 自动生成的 Javascript 代码。
  • @zmbq - 有趣有趣的乐趣... :-)
  • 幸运的是,我找到了一个似乎有 JMol 工作版本的网站——可能是旧版本。我会尝试降级并希望最好...
猜你喜欢
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 2014-07-24
  • 2013-10-08
相关资源
最近更新 更多