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