我应该避免在模块中使用顶级变量吗?

Should I avoid using top-level variables in module?

我正在用 React 编写代码,我试图将一些逻辑移动到模块中,但我很困惑。

我一直在编写如下几行的模块。

// fooModule.js
let count = 0

export function countUp() {
    count += 1
}

export function getCount() {
    return count
}

这个 count 变量无法按预期从外部模块访问。

但是,我注意到这个变量状态保持不变, 当我两次导入这个模块时, 变量状态在两者中共享。

所以,我应该改成关注吗?

// fooModule.js
export function countUp(count) {
    return count + 1
}

// someClass.js
import { countUp } from './fooModule.js'

const count = 0
const newCount = countUp(count)

谢谢。

补充:感谢您在短时间内的大量回复! 我修复了错误的示例代码。

您的第二个代码将不起作用,因为 count 不在 fooModule 的范围内,因为您是在 someClass 中创建的。如果您希望 fooModule 的每个导入器对 count 都有一个单独的绑定,一个选项是导出一个 函数 ,调用时创建一个 count 变量,returns 一个递增它的函数和 returns 新计数:

// fooModule.js
export function makeCount() {
  let count = 0;
  return () => {
    count++;
    return count;
  };
}

// someClass.js
import { makeCount } from './fooModule.js';
const counter = makeCount();
console.log(counter()); // 1
console.log(counter()); // 2

或者,使用生成器:

// fooModule.js
function* makeCount() {
  let count = 0;
  while (true) {
    count++;
    yield count;
  }
}

// someClass.js
const counter = makeCount();
console.log(counter.next().value); // 1
console.log(counter.next().value); // 2

(您也可以在上面的两个代码中使用 return ++count 而不是 count++; return count;,但在我看来这有点难读)

require 导入一次目标脚本。对该脚本的 require 的后续调用将 return 该脚本的第一次 require 调用的结果。这就是为什么可以使用循环依赖,否则循环依赖会导致死循环。

这意味着如果你想要单独的实例,你应该制作一个东西来制作这些实例,然后导出 那个 东西。生成事物实例的一些事物是:

  • 类,
  • 构造函数,
  • 工厂函数等
// fooModule.js
export class Counter {
  constructor(count = 0) {
    this.count = count
  }
  countUp() {
    return ++this.count
  }
}

// index.js
const counterA = new Counter(1)
console.log(counterA.countUp()) // 2

const counterB = new Counter(0)
console.log(counterB.countUp()) // 1