Невозможно использовать 'console.log' после перенаправления его на 'alert' - PullRequest
0 голосов
/ 07 апреля 2019

Я реализовал модуль JS, который я использую из нескольких скриптов Node.js.

Я хотел бы иметь возможность использовать этот модуль также из браузера, и я хотел бы, чтобы все сообщения отображались вокно оповещения HTML вместо терминала.

В идеале я хотел бы добиться этого, не меняя мой модуль JS (например, заменяя все вхождения console.log на alert или передаваяфункция регистрации при инициализации модуля).

Итак, я решил, что могу просто установить console.log = alert прямо перед тем, как использовать этот модуль из имеющегося у меня кода на стороне клиента.

Длявсе это имеет значение, на самом деле я делаю это с Electron (кроссплатформенные настольные приложения, использующие JavaScript), но я также проверил это в браузере, и результат тот же.

С console.log = alert я успешно изменяю console.log с function log() {[native code]} на function alert() {[native code]}.

Однако, когда я пытаюсь вызвать console.log("test"), я получаю исключение TypeError: Illegal invocation.

Вот простая клиентская сторонакод, который воспроизводит эту проблему:

<!DOCTYPE html>
<html>
    <body>
        <script type="text/javascript">
            try{
                alert(`before:\n- alert = ${alert}\n- console.log = ${console.log}`);
                console.log = alert;
                alert(`after:\n- alert = ${alert}\n- console.log = ${console.log}`);
                console.log("test");
            }
            catch (error) {
                alert(error);
            }
        </script>
    </body>
</html>

Может кто-нибудь сказать, почему я получаю эту проблему, и как я могу решить ее (в идеале, не меняя мой модуль JS)?

Возможно ли эточто alert в конце концов вызывает console.log, что приводит к некоторой бесконечной рекурсии?

Спасибо!

1 Ответ

2 голосов
/ 07 апреля 2019

Значение this имеет значение.

alert ожидает, что this будет window, а не console.

Таким образом:

console.log = window.alert.bind(window);
...