Domanda

Qualche tempo fa ho postato una domanda su cosa domande dovrebbero una buona javascript coder essere in grado di rispondere . Meder sottolineato alla seguente domanda:

Il seguente codice fa click su qualsiasi elemento "a" per avvisare (-1) a causa del fatto che "i" è premuto nella funzione onclick come riferimento e non come un valore:

<a href="#">text</a><br><a href="#">link</a>
<script>
var as = document.getElementsByTagName('a');
for ( var i = as.length; i--; ) {
    as[i].onclick = function() {
        alert(i);
        return false;
    }
}
</script>
  

La domanda è: come risolvere questo problema   implementazione affinché l'onclick   funzione mantiene il valore di i e non   è di riferimento?

Non conosco la risposta. Come sistemarlo? Come rendere i per essere una copia del valore di riferimento, piuttosto che il riferimento effettivo?

domande collaterali: sono tutti i tipi di variabili passati come un punto di riferimento? Oppure è varia che si tratti di un tipo o di un oggetto primitity?

Ogni pensiero sarebbe apprezzato.

È stato utile?

Soluzione

Per capire questo problema, è necessario imparare ciò che un chiusura è. Poi si deve anche sapere come offerte JavaScript con portata (si tratta di una funzione-base, piuttosto che su un blocco-base come C, per esempio).

Ecco la soluzione "stantard":

<a href="#">text</a><br><a href="#">link</a>
<script type="text/javascript">
var as = document.getElementsByTagName('a');
for ( var i = as.length; i--; ) {
    as[i].onclick = (function(i) {
        return function() {
            alert(i);
            return false;
        }
    })(i);
}
</script>

Un'altra versione che esattamente la stessa cosa, ma potrebbe essere più facile da capire se non siete abituati a chiusure e portata in JS è:

for ( var i = as.length; i--; ) {
    as[i].onclick = (function(number) {
        return function() {
            alert(number);
            return false;
        }
    })(i);

Ha ottenuto l'idea?

Altri suggerimenti

<a href="#">text</a><br><a href="#">link</a>
<script>
var as = document.getElementsByTagName('a');
for ( var i = as.length; i--; ) {
    as[i].onclick = function() {
        return function() {
           alert(i);
           return false;
        }
    }();
}
</script>

forse?

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