他のライブラリとの名前の競合を防ぐために、JavaScript コードを「名前空間」にパッケージ化できるようにしたいと考えています。名前空間の宣言は単純なコードである必要があるため、この機能を提供するために外部ライブラリに依存したくありません。これを簡単に行う方法についてさまざまなアドバイスを見つけましたが、 JSLintを (「The Good Parts」オプションを使用して)実行したときにエラーが発生しないように見えるものはありません。
例として、高度な JavaScript (YUI を使用しない名前空間のセクション)からこれを試しました。
"use strict";
if (typeof(MyNamespace) === 'undefined') {
MyNamespace = {};
}
これをJSLintで実行すると、次のエラーが発生します。
Problem at line 2 character 12: 'MyNamespace' is not defined.
Problem at line 3 character 5: 'MyNamespace' is not defined.
Implied global: MyNamespace 2,3
「暗黙のグローバル」エラーは、明示的に宣言することで修正できますMyNamespace
...
"use strict";
if (typeof(MyNamespace) === 'undefined') {
var MyNamespace = {};
}
...その他の 2 つのエラーは、変数を if ブロックの外で宣言することで修正できます。
"use strict";
var MyNamespace;
if (typeof(MyNamespace) === 'undefined') {
MyNamespace = {};
}
それでうまくいきますが、(MyNamespace
チェックされた時点で常に未定義になるので)それははるかに単純なものと同等です:
"use strict";
var MyNamespace = {};
JSLintはこれで満足していますが、名前空間として正しく機能しなくなるほどコードを単純化したことを懸念しています。この最終的な定式化は理にかなっていますか?