javascript - TypeError 的原因:对严格模式调用函数的访问被审查
问题描述
我正在开发一个使用 Angular 的 JMol Javascript 扩展的 Web 应用程序。这是具有挑战性的。它一直运行良好,但今天它停止在 Firefox 上运行。当我尝试某些东西时,JMol 抱怨错误
TypeError:访问严格模式调用函数被审查
这发生在 3rd 方代码中,仅在 Firefox(昨天已自行更新)上发生。它在 Chrome 上运行良好。
多年来,我发现有些人抱怨类似的错误(不使用 JMol)。他们都收到了有趣的答案——将 jQuery 降级到 1.1,包装了一些函数调用setTimeout
和其他类似的答案。
我找不到此错误原因的解释。什么是严格模式调用者,哪些访问受到审查,为什么?我也很想看到在 Firefox 上生成此错误的最小代码片段 - 所以我可以理解我要修复的内容。
解决方案
正在发生的事情是,试图使用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 方代码并更正它。
推荐阅读
- python-2.7 - 从 csv 文件读取和写入:只想提取不包含零的行
- javascript - 关于带按钮的模板字符串循环的建议
- visual-studio - 错误 JAVAC0000:错误:包 com.google.android.gms... 不存在
- javascript - 控件必须与文本标签相关联
- java - 如何在android studio中仅使用View Tag将图像用作背景图像?
- amazon-web-services - Zeppelin 错误 org.apache.thrift.transport.TTransportException
- javascript - 如何在 Javascript 中区分鼠标点击和触控板点击?
- java - 使用java进行游戏模拟有问题
- php - PHP:如何在另一个类中创建可通过 ::(双冒号,范围解析)访问的函数
- list - Prolog:定义命题逻辑语句运算符并将参数添加到列表