2

グローバルだと思っていた変数のスコープを理解するのに苦労しています。
すべてを把握するよりも、独自のグローバル名前空間を宣言して、そこに自分のものを保持する方がよいのではないかと考えました。
これはそれを行う方法ですか?

client/main.js

MyNamespace = {};

client/some_other_file.js

MyNamespace.greeting = 'hello world';
4

2 に答える 2

0

これは、javascript (および Meteor) で名前空間を定義する場合に適しています。

MyNamespace = (typeof MyNamespace === 'undefined')? {} : MyNamespace;

残念ながら、これは (構文的に) 醜い怪物です。名前空間がすぐに Javascript でネイティブにサポートされることを願っています (おそらくクラスやモジュールと一緒に)。

使用法

変数を追加するよりも、ファイルの先頭に配置できます。例えば:

ファイルMyNamespace/greeting.js:

MyNamespace = (typeof MyNamespace === 'undefined')? {} : MyNamespace;

MyNamespace.greeting = 'hello world';
// ...

ファイルMyNamespace/myFunction.js:

MyNamespace = (typeof MyNamespace === 'undefined')? {} : MyNamespace;

MyNamespace.myFunction = function() {
  // ...
}

何が問題なのMyNamespace = {};ですか?

ポイントは、名前空間が複数のファイルで定義されている場合 (Meteor のような環境内で、コードを複数の js ファイルに分割して整理し始めると、これが発生する可能性が高いことに注意してください)、MyNamespace = {};ロードされるファイルを使用することです。 for last は、以前のもののすべての定義を上書きします。

例えば:

ファイル/client/controllers/HomeController:

Controllers = {}; // define namespace Controllers

Controllers.HomeController = ...
   // ...

ファイル/client/controllers/LoginController:

Controllers = {}; // define namespace Controllers

Controllers.LoginController = ...
   // ...

Meteor ではLoginController、アルファベット順で最後にロードされ、命令は失われる定義をControllers = {};クリアします。HomeController

上記の解決策はこれを防ぎます。

于 2015-12-12T22:17:34.630 に答える