Domanda

Ecco il mio dilemma.

Ho questa sezione di codice:

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]();
}​

quello che dovrebbe accadere è che 5 funzioni inline saranno aggiunti alla matrice - ogni di prendere una copia di i . Tuttavia questo non accade.

di uscita prevista:

  

43210

uscita effettiva:

  

01234

È stato utile?

Soluzione

Hai due questioni separate, sia legato al campo di applicazione.

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. La funzione anonima si sta passando a AddToArray è legato al i variabili, non il valore corrente. Per far fronte a questo, creiamo una nuova funzione, e passare il i corrente.

  2. JavaScript ha portata la funzione, in modo che quando si ri-dichiarare i nel secondo ciclo, si sta ancora modificando la stessa variabile. Così, abbiamo rinominarlo in j.

Se solo la prima erano un problema, si otterrebbe 55555, dal momento che tutte le funzioni potrebbero utilizzare lo stesso i, a quel punto 5. Tuttavia, dal momento che si riutilizza i per il secondo indice, i è impostato per l'indice di loop di corrente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top