11

重複の可能性:
JavaScript変数スコープ

関数内でvarを使用すると、ローカル変数があることを理解しています。varを削除しない場合、グローバル変数があります。

しかし、関数の追放についてはどうですか、varはどのような効果がありますか?

4

6 に答える 6

10

まず第一に、関数の外でコードを使用することは一般的に悪い習慣です。他に何もない場合は、コードを無名関数でラップします。

(function(){
    // code
})();

varの効果については、変数を「宣言」します。

var foo;
alert(foo); // undefined;

vs:

alert(foo); // error: foo is not defined

この理由は、上記のコードが機能的に次のものと同じであるためです。

alert(window.foo);

で変数を宣言しvarないと、存在しないオブジェクトのプロパティにアクセスしようとするのと同じように、ルックアップエラーが発生します。

の奇妙な点の1つはvar、すべての宣言がスクリプトの先頭にプルされるため、これも機能することに注意してください。

alert(foo); // undefined
var foo;

また、オブジェクト内の変数にアクセスすることもできwindowます(ただし、変数をvarなしで設定することで、これも可能になりますfoo=42)。

var foo;
for(var key in window){
   // one of these keys will be 'foo'
}
于 2011-06-09T22:33:53.753 に答える
6

常にを使用することをお勧めしますvar。厳密に言えば、すでにグローバルスコープにいる場合は、そうする必要はありませんが、コードの保守性のためにそうする必要があります。

あなたが持っていると言う:

foo = 'bar';

しかし後で、このコードを関数に移動することにしました。

function doSomething() {
    foo = 'bar'; // oops forgot to add var 
}

ステートメントを追加するのを忘れた場合はvar、暗黙のグローバルを作成したばかりです。ここで、名前が付けられたグローバルスコープに新しいオブジェクトを作成すると、fooそれらは互いに競合します。

function doSomething() {
    foo = 'bar'; // Implicit global
}

foo = 'baz';
doSomething();
console.log(foo); // Returns 'bar', not 'baz'

この種のエラーは、ループのvarようなもので使用するのを忘れた場合に特に潜行します。JSLintの使用法を学ぶことは、これらおよびその他の問題のあるロジックまたは構文エラーを回避するのに役立ちます。ifor

于 2011-06-09T23:03:29.243 に答える
1

あなたの質問はhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/varで答えられます

関数の外部でのvarの使用はオプションです。宣言されていない変数に値を割り当てると、それがグローバル変数として暗黙的に宣言されます。ただし、常にvarを使用することをお勧めします。これは、次の状況の関数内で必要です。

  • 関数を含むスコープ内の変数(グローバルスコープを含む)が同じ名前の場合。
  • 再帰関数または複数の関数が同じ名前の変数を使用し、>それらの変数がローカルであることを意図している場合。

このような場合に変数を宣言しないと、予期しない結果が生じる可能性が非常に高くなります。

于 2011-06-09T22:48:03.817 に答える
0

関数の外でvarを使用することは、varを使用しないことと同じように機能すると思います。グローバルを取得します。これの例外は、クラスまたは他の名前空間構造にいる場合です。この構造では、そのロケールで変数が定義されます。

于 2011-06-09T22:32:40.477 に答える
0

変数を初期化するときはいつでも変数を作成したいと思います。私がコーディングしたように、変数を初期化する必要があるときはいつでも、varで開始します。varという単語なしで変数を宣言すると、それは常にグローバルになります。関数内でvarを使用して変数を宣言すると、その関数に対してローカルになります。var外部関数を使用して変数を作成すると、それはグローバル変数になります。

于 2011-06-09T22:32:58.177 に答える
0

グローバル変数を宣言して値を設定する場合、実用的な値はありませんが、前述のように、ベストプラクティスです。ただし、値なしで変数を宣言する場合は、「var」が必要になります。

于 2011-06-09T22:39:33.430 に答える