首页 > 解决方案 > 当给定私有变量作为参数时,Path.join 抛出异常

问题描述

我正在尝试使用 Electron,我正在尝试加载一个 html 文件,并将该文件的路径存储在一个私有变量中。请参阅下面的代码。

但是 Path.join 失败并出现此错误:

未定义的参数错误。

但是,如果我传递具有相同值的字符串文字,它就可以工作。

非工作代码:

import * as Electron from 'electron'
import * as Path from 'path'
import { Option, Some, None } from './option'

export default class Main
{
    private indexFilePath = 'index.html'
    private app: Electron.App
    private browserWindow: Option<Electron.BrowserWindow>

    constructor (app: Electron.App)
    {
        this.app = app
        this.browserWindow = new None()
        this.app.on('ready', this.onReady)
    }

    private onReady(): void
    {
        this.browserWindow = new Some(new Electron.BrowserWindow({
            width: 800,
            height: 600
        }))
        this.browserWindow.unwrap().loadFile(Path.join(__dirname, this.indexFilePath))
    }
}

工作代码:

import * as Electron from 'electron'
import * as Path from 'path'
import { Option, Some, None } from './option'

export default class Main
{
    private app: Electron.App
    private browserWindow: Option<Electron.BrowserWindow>

    constructor (app: Electron.App)
    {
        this.app = app
        this.browserWindow = new None()
        this.app.on('ready', this.onReady)
    }

    private onReady(): void
    {
        this.browserWindow = new Some(new Electron.BrowserWindow({
            width: 800,
            height: 600
        }))
        this.browserWindow.unwrap().loadFile(Path.join(__dirname, 'index.html'))
    }
}

这对我来说没有任何意义,只会增加我对任何包含 javascript 的东西的挫败感。感觉就像一架随时可能毁灭自己的怪异超音速飞机……

我确实检查了它是否是一些奇怪的打字稿编译错误,但不是,我选择哪个 javascript 版本都没有关系,结果是一样的。编译后的代码是这样的,我也看不出有什么问题:

class Main {
    constructor(app) {
        this.indexFilePath = 'index.html';
        this.app = app;
        this.browserWindow = new option_1.None();
        this.app.on('ready', this.onReady);
    }
    onReady() {
        this.browserWindow = new option_1.Some(new Electron.BrowserWindow({
            width: 800,
            height: 600
        }));
        this.browserWindow.unwrap().loadFile(Path.join(__dirname, this.indexFilePath));
    }
}

标签: javascriptnode.jstypescriptelectron

解决方案


经典范围错误:仅仅因为您从 中ready提取this,并不意味着它this.ready具有任何定义的范围,它只是一个裸函数。

因此,当您调用 时this.app.on('ready', this.onReady),您并不是在告诉 JS 在this声明时保留关键字的含义。相反,this一旦运行您的函数,该 JS 遇到的任何使用都将是“无论执行时的范围是什么”,并且当事件处理代码触发时,这将是全局范围而不是您的类实例。

非常简单的解决方案:这就是我们发明箭头函数的目的。

this.app.on('ready', () => this.onReady())

完成,当这个函数被执行时,它this仍然和声明时一样。


推荐阅读