0

これは私のコードです:

function func(){
 for(i=0; i < 5; i++){
   alert('g');
 }
}

for(i=0; i < 5; i++){
  func();
  alert('h');
}

私が期待していたのは:

しかし、受け取ったのはただのgggghでした

JSにはブロックスコープではなく、関数スコープがあるためです。私が知りたいのは、そのような動作を維持する方法です。ブロックスコープのようなものを強制することを意味します。そうしないと、非常に厄介なバグを簡単に作成できます。たとえば、他の誰かが書いた関数や自分で書いた関数を数か月前に使用している場合などです。

4

4 に答える 4

3

これは実際には、関数とブロックのスコープとは関係ありません。暗黙のグローバル変数と関係があります。

短い話:ループ内で誤ってグローバル変数を作成しています -代わりに使用すると、期待される結果が得られます。forfor(var i=0;for(i=0;

少し長いバージョン:

alert("typeof i: " + typeof i);
// Alerts "typeof i: undefined"    
function func() {
  // References the *global* variable `i`
  for(i=0; i < 5; i++){
    alert('g');
  }
}

// Creates a *global* variable `i` and sets it to 0
for(i=0; i < 5; i++) {
   alert("i at start of iteration: " + i);
   // Alerts "i at start of iteration: 0"
   func();
   // `func` has just altered *global* state - here's the proof
   alert("i after call to func: " + i);
   // Alerts "i at start of iteration: 5"
   alert('h');
}
alert("typeof i: " + typeof i);
// Alerts "typeof i: number
// `i` is now in the global scope.

// Left as an exercise for the reader:
// try it again with `var i=0;` in both of the `for` loops.
于 2012-11-06T03:30:30.040 に答える
2

変数 i のスコープに問題があります。

function func(){
 for(var i=0; i < 5; i++){
   alert('g');
 }
}

for(var i=0; i < 5; i++){
  func();
  alert('h');
}
于 2012-11-06T03:31:34.173 に答える
0

i関数でローカル変数として宣言してみてください。

function func(){
   var i;
   for(i=0; i < 5; i++){
     alert('g');
   }
}
于 2012-11-06T03:32:00.993 に答える
0

i他の回答で既に述べたように、変数をで宣言しないため、コードは機能しませんvar。これにより、自動的にグローバルになります。したがって、実際には関数とブロックのスコープの問題ではありません。を使用varして変数を宣言すると、変数のスコープは、宣言がネストされた関数内に含まれる同じ関数に制限されます。関数内にない場合はグローバルになります。

ネストされた関数で同じ変数名を使用すると、内側のスコープの変数は外側のスコープを「隠す」と言われます。その場合、内部関数はその名前の外部関数の変数にアクセスできません。その名前を使用すると、独自の変数しか与えられないためです。いわば。ただし、グローバル変数をオブジェクトのプロパティとして扱うことでアクセスできwindowます。

「私が知りたいのは、そのような動作を維持する方法です。ブロック スコープのようなものを強制することを意味します。そうしないと、非常に厄介なバグが非常に簡単に作成されます...」

いいえ、正しく使い始めるvarと、これらのバグを回避することは難しくありません。ただし、すぐに呼び出される無名関数を導入することで、ブロック スコープを強制できます。

(function() {
    // variables created in this function are accessible
    // only within this function
    var x, y, z;
})();

console.log(typeof x); // "undefined" (x can't be seen from outside the function)

function(){}関数が関数ステートメントではなく式として解釈されるように、かっこで囲む必要があります。最後の余分な()機能は、その関数式がすぐに実行されるようにすることです。この構造の一般的な用途は、スクリプト全体をその中に囲むことです。これにより、変数や関数がグローバルにならず、他の JS インクルード ファイルからロードされた他のスクリプトと相互作用しなくなります。(ブロック内で宣言されている複数の関数間で共有されるブロック内に疑似グローバル変数を含めることができます。)

たとえば、forステートメントの本文をスコープ付きの「ブロック」にしたい場合は、次のようにします。

for (var i = 0; i < something; i++) {
    (function() {
        var x = i;
        // do something with x
    })();
}
于 2012-11-06T04:01:20.057 に答える