TypeError的原因:严格访问严格模式调用者函数

时间:2018-09-17 12:45:02

标签: javascript firefox

我正在使用将JMol Javascript扩展与Angular结合使用的Web应用程序。这具有挑战性。它运行良好,但是今天停止在Firefox上运行。当我尝试某些操作时,JMol会抱怨该错误

  

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

这是在第三方代码中发生的,仅在Firefox(昨天已更新)上。它在Chrome上运行良好。

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

我找不到导致此错误的原因的说明。什么是严格模式调用者,哪些访问受到审查,为什么?我也很想看看在Firefox上生成此错误的最少代码-因此我可以理解我要解决的问题。

1 个答案:

答案 0 :(得分:2)

正在发生的事情是,尝试使用函数的caller属性的代码已由严格模式代码调用。示例:

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

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

如果您在最新版本的Firefox中运行该程序,则会在控制台中看到它:

loose
TypeError: access to strict mode caller function is censored

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

使用caller是反模式。您需要分叉正在使用的任何第三方代码,并对其进行纠正。