Pregunta

Hace un tiempo publiqué una pregunta acerca de lo que preguntas deben un buen codificador Javascript a ser capaz de responder . Meder señaló la siguiente pregunta:

El siguiente código hace clic en cualquier "un" elemento para alertar (-1) debido al hecho de que "i" es HOLD en la función onclick como referencia y no como un valor:

<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 pregunta es: ¿Cómo solucionar este problema   implementación, de manera que el onclick   la función tiene el valor de i, y no   que es la referencia?

No sé la respuesta. ¿Como arreglarlo? Como hacer i como una copia del valor de referencia en lugar de la referencia real?

preguntas secundarios: Son todos los tipos de variables pasa como una referencia? ¿O se varían de si se trata de un tipo primitity o un objeto?

Cualquier idea sería apreciada.

¿Fue útil?

Solución

Para entender este problema, debe aprender lo que es un cierre es. A continuación, también debe saber cómo javascript ofertas de alcance (que está en una función de base en lugar de en un bloque de base como C, por ejemplo).

Aquí está la solución "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>

Otra versión que hace exactamente lo mismo, pero podría ser más fácil de entender si usted no está acostumbrado a los cierres y el alcance de JS es:

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

¿Tienes la idea?

Otros consejos

<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>

tal vez?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top