为什么我需要在我的 LIFE 中使用 exports / this 构造才能在 Node REPL 中访问它?

Why do I need to use an exports / this construction in my IIFE for it to be accessible in Node REPL?

为什么当我在 Node REPL 中需要它时,我的 javascript 代码的第一个版本 return 未定义,而第二个版本有效?

当我在浏览器控制台中 运行 以下两个版本的代码时,它们似乎都在执行我想要的操作(功能有效,var text 保持私有)。这促使我问为什么我需要为第二个版本中的 exports / this 构造烦恼。

但是我注意到,如果我在 Node REPL 中需要它,第一个版本(没有那个构造)就不起作用,所以很明显导出/这是在做一些我不明白的额外事情。

谁能用简单的术语解释为什么有必要(我对 JS 比较陌生)。

没有 IIFE 和 exports/this 的第一个版本:

function Note(string) {

  var text = string;

  function getText() {
    return text;
  }

  return {
    getText: getText
  }

}

带有 IIFE 和 exports/this 的第二个版本:

(function(exports) {

  function Note(string) {

    var text = string;

    function getText() {
      return text;
    }

    return {
      getText: getText
    }

  }

  exports.Note = Note;

})(this);

你说过你是 "requiring"。当您这样做时,代码将被视为 Node 模块。 (Node 几乎总是将您的代码视为一个模块。)模块代码不在全局范围内,它在特定于您的模块的范围内。这就是为什么您需要从中导出您想要导出的内容(默认情况下其他所有内容都是私有的)。

相比之下,在浏览器中,除非你故意做一些事情来防止它成为全局的,否则它是全局的,所以你的代码没有包装器和导出创建一个全局 Note when 运行 in全局范围。

modules documentation 中,它们向您展示了当作为模块加载时您的代码 运行:

 (function(exports, require, module, __filename, __dirname) {
 // Module code actually lives in here
 });

然后这样调用 thisexports 对象(this === exports 是真的),尽管我没有在任何地方看到这个记录,当然也不会使用这个事实.