我已经实现了一个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
,从而产生某种无限递归吗?
谢谢!
答案 0 :(得分:2)
this
的值很重要。
alert
期望this
是window
而不是console
。
因此:
console.log = window.alert.bind(window);