Причина для TypeError: доступ к функции вызывающего режима строгого режима Censoered - PullRequest
0 голосов
/ 17 сентября 2018

Я работаю над веб-приложением, которое использует расширение JMol Javascript с Angular.Это сложно.Он работал довольно хорошо, но сегодня он перестал работать на Firefox.Когда я пытаюсь что-то сделать, JMol жалуется на ошибку

TypeError: доступ к функции вызова в строгом режиме подвергнут цензуре

Это происходит в стороннем коде, только в Firefox (который имеетобновился сам вчера).Он хорошо работает на Chrome.

Я обнаружил, что некоторые люди жалуются на подобную ошибку на протяжении многих лет (без использования JMol).Все они получили интересные ответы - понизив jQuery до 1.1, обернув вызов некоторой функции в setTimeout и другие подобные ответы.

Я не смог найти объяснение причины этой ошибки.Что такое вызывающий режим строгого режима, какой доступ подвергается цензуре и почему?Я также хотел бы видеть минимальный кусок кода, который генерирует эту ошибку в Firefox - так что я могу понять, что я пытаюсь исправить.

1 Ответ

0 голосов
/ 17 сентября 2018

Происходит то, что код, который пытается использовать свойство 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 вызывает конкретную ошибку, в то время как в JavaScript-движке Chrome V8 он просто возвращает значение null для .caller в строгом режиме.

Использование caller - это анти-паттерн,Вам нужно будет форкировать любой сторонний код, который его использует, и исправить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...