javascript - Electron - 为什么在关闭事件中将 BrowserWindow 实例设置为 null
问题描述
电子文档,提供以下代码示例来创建新窗口:
const {BrowserWindow} = require('electron');
let win = new BrowserWindow({width: 800, height: 600});
win.on('closed', () => {
win = null
});
win.loadURL('https://github.com');
我的问题是:为什么在关闭事件中将 win 设置为 null ?
注意BrowserWindow类继承自EventEmitter类。我不确定这些信息是否相关,但我认为将其包含在问题中可能会有所帮助。
请在您的回答中给出详细的解释。
提前致谢!
解决方案
这不是强制性的,而是一种良好的编码实践(在每种语言中)。
“关闭”的文档更详细地提到了它:
收到此事件后,您应该删除对窗口的引用并避免再使用它。
也就是说,当您销毁一个对象时,更喜欢将其设置为无效值,以避免对有缺陷/不完整的对象进行函数调用。
考虑这个例子:
const {app, BrowserWindow} = require('electron')
let win = null
app.once('ready', () => {
win = new BrowserWindow()
win.on('closed', () => {
win = null
})
setInterval(() => {
if (win) win.loadURL('http://google.com')
else app.quit()
}, 3000)
app.on('window-all-closed', () => {})
})
此处正确的'closed'
回调有助于避免将来对已销毁对象的调用。
对于电子BrowserWindow
,您也可以使用isDestroyed()
方法,这可能使使用'closed'
不必要但无效的对象是一种通用技术,而销毁查询始终取决于 API。
推荐阅读
- html - 导航项目不显示
- vim - 在 Vim 中,如何复制文件中的内容并在命令中使用?
- c - 将两个大数相乘会得出错误的结果
- centos7 - 当我要在节点中开始 slurm 时出错
- apache-httpclient-4.x - Apache HttpClient 4.5:为什么第二个包等待第一个包的ack?
- ruby-on-rails - 弹性豆茎中的克隆环境
- azure-cognitive-search - Azure 搜索规范化小写字段
- c# - 组合框作为控件模板传递,然后作为弹出窗口传递
- java - 带有 CompletableFuture 的 Java 运行循环
- javascript - ReactJS 项目中的 Firebase 身份验证 - onAuthStateChanged 中的用户为 null