Это связано с областью видимости JavaScript. Вы можете легко обойти это, введя другую область видимости, добавив функцию и заставив эту функцию вызвать себя и передать i:
for (var i = 1; i <= some_number; i++) {
(function(j) {
$("#some_button" + j).click(function() {
alert(j);
});
})(i);
}
Это создает закрытие - когда внутренняя функция имеет доступ к области, которая больше не существует, когда функция вызывается. Дополнительную информацию см. В этой статье о MDC.
РЕДАКТИРОВАТЬ: RE: Самовызывающиеся функции: самовызывающая функция - это функция, которая вызывает себя анонимно. Вы не создаете его экземпляр и не присваиваете его переменной. Он принимает следующую форму (обратите внимание на открывающие скобки):
(function(args) {
// function body that might modify args
})(args_to_pass_in);
В отношении этого вопроса тело анонимной функции будет выглядеть следующим образом:
$("#some_button" + j).click(function() {
alert(j);
});
Объединив их вместе, мы получим ответ в первом блоке кода. Анонимная функция самовызова ожидает аргумент с именем j. Он ищет любой элемент с идентификатором some_button с целочисленным значением j в конце (например, some_button1, some_button10). Каждый раз, когда щелкают по одному из этих элементов, отображается значение j. Предпоследняя строка решения передает значение i, которое является счетчиком цикла, в котором вызывается анонимная функция самовызова. Если сделать по-другому, это может выглядеть так:
var innerFunction = function(j) {
$("#some_button" + j).click(function() {
alert(j);
});
};
for (var i = 1; i <= some_number; i++) {
innerFunction(i);
}
person
Hooray Im Helping
schedule
30.06.2010
javascript,closures,иloopsбудут указывать именно на эту проблему и решения - javascript + closures + loops, включая этот сейчас :) - person Anurag   schedule 30.06.2010