Javascript 电子主can';t访问变量

Javascript 电子主can';t访问变量,javascript,node.js,electron,Javascript,Node.js,Electron,我有一个electron应用程序,其main.js文件是用一种更加面向对象的风格编写的。当我从渲染进程发送请求时,它会很好地到达。问题是,当它试图调用对象的方法时,它会声明该对象未定义 const{app,BrowserWindow,Menu,shell,dialog,session,ipcMain,webContents}=require('electron')) 类GUI扩展浏览器窗口{ /** *生成一个窗口 *@param{number}width-窗口的初始宽度。默认值为800 *@

我有一个electron应用程序,其main.js文件是用一种更加面向对象的风格编写的。当我从渲染进程发送请求时,它会很好地到达。问题是,当它试图调用对象的方法时,它会声明该对象未定义


const{app,BrowserWindow,Menu,shell,dialog,session,ipcMain,webContents}=require('electron'))
类GUI扩展浏览器窗口{
/**
*生成一个窗口
*@param{number}width-窗口的初始宽度。默认值为800
*@param{number}height-窗口的初始高度。默认值为600
*@param{number}minWidth-窗口可能的最小宽度。默认值为800
*@param{number}minHeight-窗口可能的最小高度。默认值为600
*@param{string}backgroundColor-窗口的背景色。默认值#FFF
*@param{string}icon-图标的路径。默认为空
*@param{string}indexFile-要加载的索引文件的路径。默认为null
*@param{Electron.Menu}Menu-应显示的菜单。默认为空
*/
构造器(宽度=800,高度=600,最小宽度=800,最小高度=600,背景颜色='#FFF',图标=null,索引文件=null,菜单=null){
超级({
宽度:宽度,
高度:高度,,
minWidth:minWidth,
最小高度:最小高度,
图标:图标,
背景色:背景色,
帧:假,
网络首选项:{
无融合:没错,
enableRemoteModule:true
}
})
this.fullscreen=false
此.loadFile(indexFile)
this.webContents.openDevTools()
菜单.设置应用程序菜单(菜单)
}//建造师
closeWin(){
if(this.webContents.isdevtoolsopeed==true){
this.webContents.closeDevTools()
}
这个。关闭()
}//接近
极小值(){
这个。最小化()
}
}
//当electron完成初始化时调用
app.on('ready',()=>{
让mainWindow=new GUI(800600800600,#323233','./assets/logos/logo.png',index.html'))
})
//关闭除macOS上的所有窗口时退出
app.on('window-all-closed',()=>{
if(process.platform!=='darwin'){
app.quit()
}
})
ipcMain.on('windowControl',(事件,参数)=>{
console.log(arg)
//var request=JSON.parse(arg)
var请求=arg
console.log(请求)
console.log(request.window)
如果(request.window=='mainWindow'){
if(request.func==“openPreferences”){
让preferencesWindow=新GUI(800600800600,#323233','./assets/logos/logo.png','./html/preferences.html')
}
if(request.func==“关闭”){
mainWindow.closeWin()
}
if(request.func==“min”){
main window.minimizeWin()
}
} 
if(request.window=='app'&&request.func=='exit'&&process.platform!=='darwin'){
app.quit()
}
})
单击“关闭”按钮时出现的错误:

 A JavaScript error occurred in the main process
Uncaught Exception: iN
ReferenceError: mainWindow is not defined
at IpcMainImpl.<anonymous>
(C:\Users\computronics\source\repos\DC-Model-Railway-Controller\source\desktop
client\main,js:111:13)
at IpcMainImpl.emit (events.js:223:5)
at WebContents.< anonymous> (electron/js2c/browser_init.js:173:8161)
at WebContents.emit (events.js:223:5)
其他信息

Nodejs: 12.14.1
Chrome: 83.0.4103.122
Electron: 9,1.2
V8: 8,3.110,13-electron.0
OS: Windows_NT x64 10,.0.18362
任何帮助都将不胜感激

app.on('ready', () => {
    let mainWindow = new GUI(800,600,800,600,'#323233','./assets/logos/logo.png', 'index.html')
})
您正在匿名侦听器函数内部定义变量
main window
。 尝试将变量设置为全局变量,如下所示:

var主窗口;
app.on('ready',()=>{
mainWindow=新GUI(800600800600,#323233,'./assets/logos/logo.png,'index.html')
})

另一种可能的解决办法: 将
main窗口
替换为
request.window

if (request.window == 'mainWindow'){
        if (request.func == 'openPreferences') {
            let preferencesWindow = new GUI(800,600,800,600,'#323233','./assets/logos/logo.png','./html/preferences.html')
        }
        if (request.func == 'close'){
            request.window.closeWin()
        }
        if (request.func == 'min'){
            request.window.minimizeWin()
        }
            
    }

谢谢你的帮助。你的第一个建议奏效了。
if (request.window == 'mainWindow'){
    if (request.func == 'openPreferences') {
        let preferencesWindow = new GUI(800,600,800,600,'#323233','./assets/logos/logo.png','./html/preferences.html')
    }
    if (request.func == 'close'){
        mainWindow.closeWin()
    }
    if (request.func == 'min'){
        mainWindow.minimizeWin()
    }
        
}
if (request.window == 'mainWindow'){
        if (request.func == 'openPreferences') {
            let preferencesWindow = new GUI(800,600,800,600,'#323233','./assets/logos/logo.png','./html/preferences.html')
        }
        if (request.func == 'close'){
            request.window.closeWin()
        }
        if (request.func == 'min'){
            request.window.minimizeWin()
        }
            
    }