在Javascript中,一个导出的变量是否被视为全局变量?

3

这是我一直想知道的问题。假设我有一个Express应用程序。我将这个导出写在它自己的文件中:

// my-var.js
export const myVar = new Thing();

接下来我创建服务器并访问该变量:

// index.js
import { myVar } from './my-var';
import { myRoutes } from './my-routes';

function startServer() {
    myVar.doSomething(); /* 1 */

    const app = express();
    app.use('/', myRoutes);
    
    app.listen(port, () => {});
}

最后,我的路由也使用了这个变量:

// my-routes.js

import { Router } from 'express';
import { myVar } from './my-var';

const router = new Router();

router.get((req, res) => {
    myVar.doSomething(); /* 2 */
    res.json({});
});

所以我的问题是:.1和.2引用的是同一个变量吗?还是已经实例化了两次?我认为每次导入文件时都会进行实例化,因为导入文件会运行该文件中的代码。所以myVar = new Thing();每次运行该文件时都会执行。
2个回答

1
脚本文件只执行一次,并且只有一个结果。如果导出了任何对象,则所有模块都将引用该对象的同一实例。
const myVar = new Thing();

myVar 只会被创建一次,然后被导出。

你可以尝试在一个模块中更改属性,并检查另一个模块中的属性以确保其正确性。


谢谢你的回答!我进行了测试并验证了这一点。但是我不太明白它是如何工作的。我以为每次导入文件时,都会执行它。但是我在 my-var.js 中添加了一个 console.log,即使我在两个不同的位置导入该文件,它也只打印了一次。 - Troncoso
@Troncoso 不,文件在每次导入时都不会被执行;当一个文件首次被加载时,它会被执行并且Node会记住(缓存)该文件,因此不会重新执行。 - Dave Newton

1
这就是我们所说的单例模式(package design),当你像这样做时:
export const myVar = new Thing()

你只需要创建一个Thing实例,之后每次导入它时,都是导入同一个实例,因为现在它是一个引用。

如果你想每次导入myVar时都获得一个新的引用,请更改代码:

从:

export const myVar = new Thing()

To

export const myVar = () => new Thing()

当您导入它时,请按以下方式使用:

import { myVar } from './my-var'

const instance = myVar() // returns a new instance from Thing

// use the instance here, ex: instance.color

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接