質問

多くの場合、名前空間として機能するJavaScriptコードで定義されているグローバルオブジェクトが表示されます。

var MyNS = {a: function() {}, ... };

しかし、時々、私は人々が「var」キーワードを除外するのを見る

MyNS = {a: function() {}, ...};

VARで変数を定義しない場合、Webブラウザを信じています。これは、グローバルネームスペースとして機能するウィンドウオブジェクトに入れられます。 「var」を使用しないことで数バイトのテキストを保存するため、キーワードを使用する理由はあります この特定の目的のために ?

役に立ちましたか?

解決

「var」を使用しないことでテキストの数バイトを保存するため、この特定の目的にキーワードを使用する理由はありますか?

避けることはお勧めしません var キーワードは、グローバルコードを使用していても。

2つの方法は似ているように見えますが、実際にはそれらは同じではありません、最初は 変数宣言, 、 可変オブジェクト グローバルコードでは、グローバルオブジェクト自体であるため、グローバル変数がグローバルオブジェクトのプロパティとしてアクセスできるのはそのためです。window.MyNS).

2つ目は次のとおりです 未申告の割り当て, 、識別子がスコープチェーンに見つからない場合、グローバルオブジェクトにプロパティを作成します。

それを避ける本当の理由は、言語の新しい標準であるecmascript第5版、under 厳密なモード, 、宣言されていない識別子への割り当てがスローします ReferenceError コードを破る。

また、2つの例の間には別の微妙な違いがあります。変数インスタンス化は、無視できないグローバルオブジェクト上のプロパティを作成します。

var myVar = '';
delete window.myVar; // false
typeof window.myVar; // 'string'

宣言されていない割り当てはそうではありませんが、

myProp = '';
delete window.myProp; // true
typeof window.myProp; // 'undefined'

推奨記事:

他のヒント

の用法 var 現在の範囲のローカル変数を定義します。あなたがグローバルな範囲にある場合、それらは効果的に同等です。の用法 var 意図は絶対に明確であるため、理解可能性と保守性のためにさらに多くのものがあります。初期化せずにそれほど明確ではありません var.

任意のローカル範囲で、if MyNS スコープチェーンのどこかに初期化され、グローバル変数を定義するのではなく、ローカル変数を上書きすることになります。

キーワードは習慣を身につけ、関数体内の内部を忘れたときに厄介なエラーを防ぐのに役立つので、キーワードを使用するのはいいことだと思います。また、いくつかのグローバルコードが関数に移行したことがわかった場合にもいいです。

しかし、いいえ、それは厳密に必要ではありません。

編集 - @EyElidHessNessは本当に良い点を持っていますが、グローバルレベルでコードを入力している場合、すでに問題ではありません。

私が見たかなり防弾パターンは、このようなものでグローバルネームスペースを初期化することです。

(function(window, undefined) {

  var foo = { stuff: "in my namespace", ... };

  window.foo = foo;
})(this);

グローバルレベルで、 this ウィンドウオブジェクトになります(ブラウザにいる場合は、そうでない場合は、グローバルオブジェクトがそのコンテキストにあるものは何でも)。

この正確な質問についてダグラス・クロックフォード:http://www.yuiblog.com/blog/2008/04/16/global-domination-part-two/

彼は初期化でコメントを使って解決しますが、 var. 。トレードオフの彼の分析は、あなたが同意しないとしても読む価値があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top