Почему мне нужно использовать экспорт / эту конструкцию в моем IIFE, чтобы она была доступна в Node REPL?

Почему первая версия моего кода javascript возвращает неопределенное значение, когда я требую его в Node REPL, тогда как вторая версия работает?

Когда я запускаю две версии кода ниже в консоли браузера, они обе делают то, что я хочу (функции работают, текст var остается закрытым). Это побудило меня спросить, зачем мне возиться с экспортом/этой конструкцией во второй версии.

Однако я заметил, что первая версия (без этой конструкции) не работает, если я требую ее в Node REPL, поэтому явно экспортирует/это делает что-то дополнительное, чего я не понимаю.

Может ли кто-нибудь объяснить, почему это необходимо, простыми словами (я относительно новичок в JS).

Первая версия без IIFE и экспорта/этого:

function Note(string) {

  var text = string;

  function getText() {
    return text;
  }

  return {
    getText: getText
  }

}

Вторая версия с IIFE и экспортом/этим:

(function(exports) {

  function Note(string) {

    var text = string;

    function getText() {
      return text;
    }

    return {
      getText: getText
    }

  }

  exports.Note = Note;

})(this);

person Elishka    schedule 26.07.2018    source источник
comment
Как вы этого требуете?   -  person T.J. Crowder    schedule 26.07.2018


Ответы (1)


Вы сказали, что вам это «требуется». Когда вы это делаете, код рассматривается как модуль Node. (Node почти всегда рассматривает ваш код как модуль.) Код модуля находится не в глобальной области видимости, а в области, специфичной для вашего модуля. Вот почему вам нужно экспортировать из него то, что вы хотите экспортировать (все остальное по умолчанию является приватным).

Напротив, в браузере, если вы не делаете что-то специально, чтобы он не был глобальным, он глобальный, поэтому ваш код без оболочки и экспорта создает глобальный Note при запуске в глобальной области.

В документации по модулям показано, как выполняется ваш код при загрузке в виде модуля. :

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

Затем это называется так, что this является объектом exports (this === exports верно), хотя я нигде не вижу, чтобы это было задокументировано, и, конечно, не использовал бы этот факт.

person T.J. Crowder    schedule 26.07.2018