重定向到 'alert' 后无法使用 'console.log'

Unable to use 'console.log' after redirecting it to 'alert'

我已经实现了一个 JS 模块,我从几个 Node.js 脚本中使用它。

我希望也能从浏览器使用这个模块,我希望所有消息都显示在 HTML 警报框而不是终端中。

理想情况下,我想在不更改我的 JS 模块的情况下实现这一点(例如,通过将所有出现的 console.log 替换为 alert,或者在我初始化模块时传递日志记录功能).

所以我想我可以简单地设置 console.log = alert 就在我从我的客户端代码中使用这个模块之前。

尽管如此,我实际上是用 Electron 做的(使用 JavaScript 的跨平台桌面应用程序),但我也在浏览器上测试过,结果是一样。

使用console.log = alert,我成功地将console.logfunction 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,从而产生某种无限递归?

this 的值很重要。

alert 期望 thiswindow 而不是 console.

因此:

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