JavaScriptにおけるクロージャを利用したモジュールでのオブジェクトエクスポート

次のようなモジュールがあるとします:

javascript;(function() {
  function func1() {
    alert('モジュールの関数');
  }
  function func2() {
    alert('モジュールの関数');
  }
  function func3() {
    alert('モジュールの関数');
  }
})();

ここで、3つの関数すべてを外部にエクスポートしたいとします。この場合、モジュールの外部で余分な関数名を増やさないために、すべての関数を1つのオブジェクトに格納し、そのオブジェクトをエクスポートするのが良い方法です:

javascript;(function() {
  function func1() {
    alert('モジュールの関数');
  }
  function func2() {
    alert('モジュールの関数');
  }
  function func3() {
    alert('モジュールの関数');
  }
  
  window.module = {func1: func1, func2: func2, func3: func3};
})();

キー名と変数名が一致しているので、関数を含むオブジェクトは以下のように簡略化できます:

javascript;(function() {
  function func1() {
    alert('モジュールの関数');
  }
  function func2() {
    alert('モジュールの関数');
  }
  function func3() {
    alert('モジュールの関数');
  }
  
  window.module = {func1, func2, func3};
})();

別の方法もあります。関数を定義する際に、直接オブジェクトに関数を登録する方法です。以下のようになります:

javascript;(function() {
  let module = {};
  
  module.func1 = function() {
    alert('モジュールの関数');
  }
  module.func2 = function() {
    alert('モジュールの関数');
  }
  module.func3 = function() {
    alert('モジュールの関数');
  }
  
  window.module = module;
})();
Задание 1

次のモジュールがあるとします:

javascript;(function() {
  let str1 = 'モジュールの変数';
  let str2 = 'モジュールの変数';
  let str3 = 'モジュールの変数';
  
  function func1() {
    alert('モジュールの関数');
  }
  function func2() {
    alert('モジュールの関数');
  }
  function func3() {
    alert('モジュールの関数');
  }
  function func4() {
    alert('モジュールの関数');
  }
  function func5() {
    alert('モジュールの関数');
  }
})();

最初の5つの関数と最初の2つの変数を含むオブジェクトを外部にエクスポートしてください。