将其重定向到“警报”后无法使用“ console.log”

时间:2019-04-07 10:46:42

标签: javascript node.js alert console.log

我已经实现了一个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,从而产生某种无限递归吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

this的值很重要。

alert期望thiswindow而不是console

因此:

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