То, что вы сделали, является одной из самых распространенных ошибок при использовании Javascript-замыканий.
Кстати, сам факт, что эта ошибка настолько распространена, является IMO доказательством того, что это действительно «ошибка» в самом языке.
Javascript поддерживает замыкания на чтение и запись, поэтому при захвате переменной в замыкании записывается не текущее значение переменной, а сама переменная .
Это означает, что, например, в
var arr = [];
for (var i=0; i<10; i++)
arr.push(function(){alert(i);});
каждая из 10 функций в массиве будет содержать замыкание, но все они будут ссылаться на одну и ту же переменную i
, используемую в цикле, а не на значение, которое эта переменная имела во время создания замыкания. Поэтому, если вы вызовете любой из них, результат будет одинаковым (например, 10
, если вы вызываете их сразу после цикла).
К счастью, обходной путь прост:
var arr = [];
for (var i=0; i<10; i++)
arr.push((function(i) {
return (function(){alert(i);});
})(i));
используя эту «оболочку», вы вызываете анонимную функцию, и внутри этой функции переменная i
отличается от цикла и фактически является переменной для каждого вызова. Внутри этой функции i
является просто параметром, и возвращаемое замыкание привязано к этому параметру.
В вашем случае решение таково:
for (id = 50; id < 100; id++)
{
if($('#'+id).attr('class') == 'myField')
{
$('#'+id).bind('click',
(function(id){
return (function() { install(id); });
})(id));
}
}