3

varキーワードが関数内で何を意味するのか理解しましたが、今は関数外でvarキーワードの目的が何であるかを理解しようとしています。私はいくつかのテストを行いました(以下を参照)が、違いはありません。では、varキーワードを関数の外に置いた場合に違いが生じるのはいつですか?

1.1。

example = 1;
function test(){  
  var example = 2;
}
test();
alert(example); //alert 1 no matter if example=1 or var example=1 before function

2.2。

example = 1;
function test(){  
  example = 2;
}
test();
alert(example); //alert 2  no matter if example=1 or var example=1 before function

3.3。

var example = 1;
function test(){   
  alert(example);   
}
test(); //always alert 1, no matter if var example=1 or example=1 before function
4

7 に答える 7

1

キーワードvarは、現在のスコープで変数を宣言します (まあ、技術的には同じクロージャーですが、今は単純にしておきます)

関数 (テスト) と変数 (例) の両方が「グローバル」スコープで宣言されているため、両方とも相互にアクセスtestでき、関数が変数にアクセスできることを意味しますexample

最初の例では、example と呼ばれる新しい var を宣言しました。これは、(メソッド内で) var example を呼び出すと、代わりにこの変数を参照することを意味します。

于 2012-08-08T17:10:08.593 に答える
1

違いがあります!

この回答https://stackoverflow.com/a/1471738/211070を参照してください。ただし、基本的には:

変数宣言は DontDelete フラグを使用してプロパティを作成するため、var x = 1 と x = 1 (グローバル スコープで実行した場合) の違いは、前者 (変数宣言) は DontDelete'able プロパティを作成し、後者は作成しないことです。結果として、この暗黙の代入によって作成されたプロパティはグローバル オブジェクトから削除できますが、以前のもの (変数宣言によって作成されたもの) は削除できません。

于 2012-08-08T17:12:54.463 に答える
0

厳密モードでない限り、グローバル空間に実際の違いはありません。

そうは言っても、あなたはまだvar良いプログラミングの練習として使うべきです。自動定義された変数は悪です。

于 2012-08-08T17:10:53.383 に答える
0

関数内に変数を配置すると、PHP IFステートメントのようにその関数内でのみ使用できると思いますが、関数内に変数を配置した場合は、複数の関数で使用できます-その中の変数のようにページのスコープ。

于 2012-08-08T17:11:13.587 に答える
0

var-Keywordは、関数内で使用する場合と関数外で使用する場合とまったく同じように機能します。つまり、新しい変数を現在のスコープにバインドします。関数の場合、スコープは関数です。関数の外では、グローバルスコープが使用されます。ブラウザでは、そのグローバルスコープは通常window-Objectです。

lg、

flo

于 2012-08-08T17:12:05.910 に答える
0

varキーワードは、現在のスコープで変数を宣言します。それがないと、オブジェクトで新しいプロパティを自動的に宣言するwindowか、より高いスコープで同じ名前の変数にアクセスして変更することになります (存在する場合)。あなたの例では、グローバル スコープと内部関数スコープしかないためvar example = 1、グローバル スコープでは、目的のために、技術的には と同じですexample = 1。ただし、上記のコードがすべて他の関数スコープ内で実行された場合、最初の 2 つの例はグローバルexampleプロパティを宣言し、3 つ目はそのスコープに対してローカルな変数を宣言します。

于 2012-08-08T17:13:03.303 に答える
0

1)これが警告する理由1は、事前に関数を呼び出しているにもかかわらずtest()、それ自体が独自のクロージャーを呼び出して作成し、そのvar example = 2;内部で別のクロージャーを宣言しているためです。(したがって、アラートはそれを見ることができず、1つしか見えません)。もしそうなら: return example = 2;alert(example) === 2 に気付くでしょう。これは、例をクロージャから取り出し、前の例の変数に影響を与えたためです。

example = 1;
function test(){  
    var example = 2;
}
test();
alert(example);

2)ここでは、関数内に新しい変数を作成していないため、(クロージャーを介して) 外部の変数の例にアクセスし、それを 2 に変更できます。

example = 1;
function test(){  
  example = 2;
}
test();
alert(example); //alert 2  no matter if example=1 or var example=1 before function

3)この最後の例は、「閉鎖」がここでどのように機能するかを示す良い例です。変数は、変数にアクセスしようとするものの上function ()で宣言する必要があるとしましょう。一方、関数はそうではありません。だから、それ自体より下かもしれませんが、それは問題ではありません重要なのは、 CALL toの前に宣言されていることです。これは、クロージャーが作成され、表示/アクセスできる変数などをラップするときです。var example = 1function test() { }test()

// so this ...
var example = 1;
function test(){   
    alert(example);   
}

// and this work ...
function test(){   
    alert(example);   
}
var example = 1; // <-- notice it's still above the test() func call, it can still see example
test(); //always alert 1, no matter if var example=1 or example=1 before function
// if var example = 1; was down here below it, it would alert "undefined", this is because
// the variable was not available within the scope when test() was called.
于 2012-08-08T17:18:08.683 に答える