グローバルだと思っていた変数のスコープを理解するのに苦労しています。
すべてを把握するよりも、独自のグローバル名前空間を宣言して、そこに自分のものを保持する方がよいのではないかと考えました。
これはそれを行う方法ですか?
client/main.js
MyNamespace = {};
client/some_other_file.js
MyNamespace.greeting = 'hello world';
グローバルだと思っていた変数のスコープを理解するのに苦労しています。
すべてを把握するよりも、独自のグローバル名前空間を宣言して、そこに自分のものを保持する方がよいのではないかと考えました。
これはそれを行う方法ですか?
client/main.js
MyNamespace = {};
client/some_other_file.js
MyNamespace.greeting = 'hello world';
これは、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
上記の解決策はこれを防ぎます。