Это связано с определением области JavaScript. Вы можете обойти это легко путем введения другой сферы, добавив функцию и иметь, что вызов функции себя и передать в I:
for (var i = 1; i <= some_number; i++) {
(function(j) {
$("#some_button" + j).click(function() {
alert(j);
});
})(i);
}
Это создает замыкание - когда внутренняя функция имеет доступ к области, которая больше не существует когда функция вызывается. См. this article на MDC для получения дополнительной информации.
EDIT: 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);
}
Это очень распространенная проблема, как и большинство ответов. Кроме того, все вопросы, помеченные 'javascript',' closures, 'и' loops' будут указывать на эту точную проблему и решения - [javascript + замыкания + циклы] (http://stackoverflow.com/questions/tagged/javascript+closures+ петли), в том числе и этот сейчас :) – Anurag
Нам нужен способ для SO, чтобы иметь огромное всплывающее высказывание «ЭТО БЫЛО ОТНОСИТСЯ ДО», со ссылками на правильный вопрос. Я видел как минимум 3 версии javascript и 2 версии python, задающих этот вопрос. – Claudiu
@ Claudiu: К сожалению, для новичков JavaScript/Python очень сложно искать подобные проблемы. –