2

これが私のジレンマです。

私はコードのこのセクションを持っています:

var list_of_numbers = new Array();

function AddToArray(func)
{
    // Add to the *beginning* of the array
    // essentially reversing the order

    list_of_numbers.unshift(func);
}

function DisplayNumber(num)
{
    document.write(num);
}

for(var i=0;i<5;++i)
{
   AddToArray(function() { DisplayNumber(i); });
}

for(var i=0;i<5;++i)
{
   list_of_numbers[i]();
}​

発生するはずのことは、5つのインライン関数が配列に追加されることです-それぞれがのコピーを取りますi。ただし、これは発生しません。

期待される出力:

43210

実際の出力:

01234

4

1 に答える 1

3

2つの別々の問題があり、どちらもスコープに関連しています。

var list_of_numbers = new Array(); 
function AddToArray(func) 
{ 
    // Add to the *beginning* of the array
    // essentially reversing the order 
    list_of_numbers.unshift(func); 
} 

function DisplayNumber(num) 
{ 
    document.write(num); 
} 
for(var i=0;i<5;++i) 
{ 
    (function(i) 
     { 
         AddToArray(function(){ DisplayNumber(i); });
     })(i); 
} 

for(var j=0;j<5;++j) 
{ 
    list_of_numbers[j](); 
}​
  1. 渡す匿名関数は、現在の値ではなく、AddToArray変数にバインドされます。iこれに対処するために、新しい関数を作成し、現在のを渡しiます。

  2. iJavaScriptには関数スコープがあるため、2番目のループで再宣言しても、同じ変数を変更していることになります。したがって、名前をに変更しjます。

i最初の問題だけが問題だった場合、その時点ですべての関数が同じを使用するため、55555が発生します。ただし、 i2番目のインデックスで再利用するためi、現在のループインデックスに設定されます。

于 2010-09-04T06:19:02.713 に答える