Это связано с областью 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);
}