代码之家  ›  专栏  ›  技术社区  ›  zmbq

TypeError的原因:对严格模式调用函数的访问被拒绝

  •  1
  • zmbq  · 技术社区  · 6 年前

    我正在开发一个使用jmoljavascript扩展和Angular的web应用程序。这很有挑战性。它一直工作得很好,但今天它停止了在Firefox上的工作。当我尝试一些JMol抱怨的错误

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

    这在第三方代码中发生,仅在Firefox上发生(Firefox昨天已经自我更新)。在Chrome上效果很好。

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

    我找不到这个错误的原因的解释。什么是严格模式调用程序,哪个访问被审查,为什么?我也希望看到一段在Firefox上生成这个错误的代码,这样我就可以理解我要修复什么了。

    1 回复  |  直到 6 年前
        1
  •  2
  •   T.J. Crowder    6 年前

    正在发生的是试图使用 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 在调用函数处于松散模式时工作,但在调用函数处于严格模式时失败。访问 来电者 属性在严格模式下是不允许的,甚至在“松散”代码中使用时也是不允许的,如果调用方函数本身是严格的。Firefox会引发一个特定的错误,而Chrome的v8javascript引擎只返回值 null 对于 .caller 在严格模式下。

    使用 caller