【问题标题】:Why do I need to use an exports / this construction in my IIFE for it to be accessible in Node REPL?为什么我需要在我的 LIFE 中使用 export / this 构造才能在 Node REPL 中访问它?
【发布时间】:2019-01-03 08:52:21
【问题描述】:

为什么当我在 Node REPL 中需要时,我的 javascript 代码的第一个版本返回 undefined,而第二个版本有效?

当我在浏览器控制台中运行以下两个版本的代码时,它们似乎都在执行我想要的操作(函数有效,var 文本保持私有)。这促使我问为什么我需要在第二个版本中处理导出/这个结构。

但是我注意到,如果我在 Node REPL 中需要它,第一个版本(没有该结构)将不起作用,因此很明显导出/这是在做一些我不理解的额外操作。

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

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

function Note(string) {

  var text = string;

  function getText() {
    return text;
  }

  return {
    getText: getText
  }

}

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

(function(exports) {

  function Note(string) {

    var text = string;

    function getText() {
      return text;
    }

    return {
      getText: getText
    }

  }

  exports.Note = Note;

})(this);

【问题讨论】:

  • 你需要它吗?
  • let Note = require('./src/note-model.js').Note

标签: javascript module this iife


【解决方案1】:

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

相反,在浏览器中,除非您故意采取措施防止其成为全球性的,否则它就是全球性的,因此您的代码没有包装器和导出功能时会在全局范围内运行时创建一个全局 Note

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

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

然后这样调用 thisexports 对象(this === exports 是真的),虽然我没有看到任何地方记录并且肯定不会使用这个事实。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    相关资源
    最近更新 更多