2013-07-06 25 views
5

cerco di capire la portata variabile in Javascript. Ecco quello che sto facendo:javascript: localizzare le variabili nel blocco

<script> 
for (var i = 0; i < 3; i++) { 
    document.getElementById(i).onclick = function() { 
    console.log(i); 
    } 
} 
</script> 

L'uscita è sempre 3, e capisco che è perché i è stata mantenuta per riferimento. Come faccio a localizzare i in modo che possa registrare il valore incrementato?

Grazie!

aggiornamento

Grazie ragazzi per risposte rapide e decente. le soluzioni sono davvero d'aiuto!

Inizialmente, stavo cercando un approccio simile a @GrailsGuy, eccolo:

<script> 
for (var i = 1; i <= 3; i++) { 
    document.getElementById(i).onclick = function() { 
     console.log(logCall(i)); 
    } 
} 
function logCall(i) { 
    return i; 
} 
</script> 

ma sembra i non viene localizzato. Non riesco a capire perché!

+0

Ha qualcosa a che fare con l'evento onclick? Come è possibile eseguire il ciclo attraverso l'onclick se l'utente fa clic una sola volta? E hai bisogno della funzione logCall()? Non sarebbe lo stesso di console.log (i)? – oobie11

+0

Per quanto riguarda la modifica, è lo stesso problema del primo esempio. Se si dispone di 'console.log (i)' o 'superlongandconfusingfunctionname (i)' all'interno del gestore di eventi non fare la differenza. Stai provando ad accedere a 'i' dopo che il ciclo è terminato. –

risposta

7

creare un nuovo ambito

for (var i = 0; i < 3; i++) { 
    (function(i) { 
    document.getElementById(i).onclick = function() { 
     console.log(i); 
    } 
    }(i)); 
} 
2

in JavaScript, campo di applicazione non è stato creato da parentesi (contrari alla sintassi C-like). Scope è però, creato nel funzioni, in modo un modo è quello di estrarre la chiamata in una funzione (aggiornato):

<script> 
for (var i = 0; i < 3; i++) { 
    logCall(i); 
} 

function logCall(i) { 
    document.getElementById(i).onclick = function() { 
     console.log(i); 
    } 
} 
</script> 

Questo ha il vantaggio di rendere il codice di un po 'più riutilizzabile.

+0

Perché il downvote? – Igor

+0

non ho downvote, ma il codice non risolve nulla. – Prinzhorn

+1

questo non è corretto, http://jsfiddle.net/GaCPv/ – Musa

Problemi correlati