Tiene que ver con el alcance de JavaScript. Puede moverse con facilidad mediante la introducción de otro ámbito mediante la adición de una función y tener esa función llama a sí mismo y pase en i:
for (var i = 1; i <= some_number; i++) {
(function(j) {
$("#some_button" + j).click(function() {
alert(j);
});
})(i);
}
Esto crea un cierre - cuando la función interna tiene acceso a un ámbito que ya no existe cuando se llama a la función. Consulte this article en el MDC para obtener más información.
EDIT: RE: Funciones de auto llamada: una función de auto llamada es una función que se llama de forma anónima. No lo instancias ni lo asignas a una variable. Se toma la forma siguiente (tenga en cuenta los parens de apertura):
(function(args) {
// function body that might modify args
})(args_to_pass_in);
Relacionando esto con la pregunta, el cuerpo de la función anónima sería:
$("#some_button" + j).click(function() {
alert(j);
});
Combinando estos juntos, obtenemos la respuesta en el primer bloque de código La función de auto-llamada anónima espera un argumento llamado j
. Busca cualquier elemento con una identificación de some_button
con el valor entero de j
al final (por ejemplo, some_button1, some_button10). Cada vez que se hace clic en uno de estos elementos, se alerta el valor de j
. La penúltima línea de la solución pasa en el valor i
, que es el contador de bucles donde se llama a la función de auto-llamada anónima. Hecho de otra manera, podría tener este aspecto:
var innerFunction = function(j) {
$("#some_button" + j).click(function() {
alert(j);
});
};
for (var i = 1; i <= some_number; i++) {
innerFunction(i);
}
Es un problema muy común que la mayoría de las respuestas indican. Además, todas las preguntas etiquetadas con 'javascript', 'closures,' y 'loops' apuntarán a este problema y a las soluciones exactas - [javascript + closures + loops] (http://stackoverflow.com/questions/tagged/javascript+closures+ loops), incluido este ahora :) – Anurag
necesitamos una forma para que SO tenga una gran ventana emergente que diga "ESTO HA SIDO RESPUESTA ANTES", con enlaces a la pregunta correcta. He visto al menos 3 versiones de javascript y 2 de python que hacen esta pregunta. – Claudiu
@Claudiu: Desafortunadamente es muy difícil para los recién llegados a JavaScript/Python buscar este tipo de problemas. –