Come copiare il valore di un riferimento in javascript?
-
12-09-2019 - |
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.
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?