В этом блоге описывается проблема, с которой вы столкнулись. Объявление var ctrl
фактически интерпретируется как локально-функциональное, а не локальное для цикла.
Вы можете обойти это, написав что-то вроде этого:
$(document).ready(function() {
for (ctrlName in fieldCtrls){
function(ctrl) { // create a new anonymous function ...
ctrl.Initialize = function(){
//Do some stuff
ctrl.someProperty = "newValue";
}
ctrl.Validate= function(){
//Do some more stuff
ctrl.someProperty = "validation ok";
}
}(fieldCtrls[ctrlName]); // ... and call the function right away
}
}
Это заставляет новую область видимости для ctrl
для каждой итерации цикла, поэтому каждая функция захватывает разные переменные вместо одной и той же каждый раз.
(Нет. Не проверено, и я не гуру JavaScript. Однако эта проблема мучает большинство языков сценариев с поддержкой замыканий.)