2016-10-25 10 views
7

私はfooModuleというモジュールを持っています。このモジュールの内部では、私はインポートfooModule(自体):es6モジュールはどのように自分自身をインポートできますか?

import * as fooModule from './fooModule'; 

export function logFoo() { 
    console.log(fooModule) 
} 

logFoo()が呼び出されると、私はfooModuleの輸出のすべてを見ることができます。 これはどのように機能しますか?

+1

あなたは何をしたいですか? – anshuVersatile

+6

インポートは必須ではなく、解決と実行は別です。インポートが最初に解析され、解決されます。コードが実行されるまでに、すべてのバインディングはすでに解決されています。 – Joseph

+2

ベストプラクティスはこれをしないことです –

答えて

8

宣言的なインポート/エクスポートでは、循環依存は問題ありません。 :-)

ソリューションはimportが変数に値をインポートしていないということですが、それは、変数エクスポート変数へ参照作ることにかかわらず、あなたのケースでは、円は最低限の長さです。可変変数の例はhere、正確な用語はthis questionをご覧ください。
モジュールネームスペースオブジェクトでも同じです。それらのプロパティは、実際にエクスポートされた変数を解決するゲッターだけです。あなたのモジュールがロードされ、評価されたときに

だから、次の手順が発生します。

  1. ソースを静的モジュールスコープが作成された依存関係グラフ
  2. を構築するためにexportimport宣言のために分析されて
  3. あなたのモジュールの唯一の依存関係はそれ自体であり、すでに初期化されているので、それを待つ必要はありません。
  4. fooModule変数が作成され、エクスポートされたモジュールの名前を持つオブジェクト。これは["logFoo"]であることが知られています。 fooModule.logFooプロパティはgetterになり、モジュールスコープの変数logFooになります(export {A as B}を使用した場合、fooModule.BAに解決されますが、両方の名前が同じです)。
  5. モジュールスコープ内の変数の宣言は、あなたのケースlogFooには、変数を作成し、関数宣言が初期化されている(すなわちlogFooは機能が割り当てられます)
  6. モジュールコードが実行される(あなたの場合には、何も起こりません)

logFooをインポートするモジュールでfooModuleを呼び出すと、logFooを含む名前空間が参照されます。いいえ魔法:-)

+0

私はあなたがSOに入れているすべての時間を感謝しますが、私はこの動作のユースケースを理解できません。上で述べたように、これは重複したコードを避けるために使用できますが、意味論的にはいつ何かがそれ自体に依存するのが理にかなっていますか? – aaaaaa

+1

@aaaaaa自分自身のモジュール名前空間オブジェクトを取得する(動的プロパティへのアクセス、デフォルトエクスポートなどのために、このようなオブジェクトを手動で構築するのを避ける)、そして自分自身の[anonymous default export] (http:// stackoverflow。com/a/35225936/1048572)(何らかの理由で名前を付けることができない場合) – Bergi

関連する問題