0

次のJavaスニペットでは、のスコープはループiの内側に限定されています。forそのため、エラーが発生します。ただし、同様のJSスニペットでiは、ループの外側からアクセスできるようです。そんなことがあるものか?

Java:

for(int i=0;i<10;i++) {
    ...
}
System.out.println(i);

出力:「iは定義されていません」

JS:

for(var i=0;i<10;i++) { 
    ...
}
console.log(i);

出力:10

JSからの出力を期待していませんでした。JSとJavaの違いを知りたいです。JavaScript変数スコープはどのように機能しますか?

4

2 に答える 2

13

Javascriptでは、「ローカル」変数にはブロックスコープではなく関数スコープがあります。

すべてのローカル変数宣言は現在のスコープの先頭に「持ち上げられ」ているため、コードは次のようになります。

var i;
for (i = 0; i < 10; ++i) {
}
console.log(i);

宣言は引き上げられますが、割り当ては引き上げられないことに注意してください。例:このコード

function test() {
    console.log(i);  // undefined
    var i = 1;       // declaration and assignment
    console.log(i);  // 1
}

と同等です:

function test() {
    var i;           // declaration hoisted
    console.log(i);  // undefined
    i = 1;           // assignment still happens here
    console.log(i);  // 1
}
于 2012-09-28T18:03:43.313 に答える
4

Javascriptには、グローバルと機能の2種類のスコープしかありません。Javascriptは、関数レベルで字句スコープが設定されています。

于 2012-09-28T18:03:58.227 に答える