Как сохранить переменную в области видимости - PullRequest
1 голос
/ 08 августа 2010

У меня есть ассоциативный массив объектов, который я хочу расширить с помощью ряда функций. myCtrls //Array of objects

Я делаю это с помощью следующего цикла

$(document).ready(function() {
    for (ctrlName in fieldCtrls){
        var ctrl = fieldCtrls[ctrlName];

        ctrl.Initialize = function(){
            //Do some stuff
            ctrl.someProperty = "newValue";
        }
        ctrl.Validate= function(){
            //Do some more stuff
            ctrl.someProperty = "validation ok";
        }
}

Позже я выполняю такую ​​функцию. Однако переменная 'ctrl' теперь всегда указывает на последний объект в 'fieldCtrls'. Как я могу заставить переменную 'ctrl' работать внутри 'initialize ()' и 'Validate ()'?

fieldCtrls['id'].Validate();

Ответы [ 2 ]

3 голосов
/ 08 августа 2010

Область видимости изменится на вызывающий объект - fieldCtrls['id']. Поэтому вы должны иметь возможность использовать this для доступа к внутренним свойствам.

ctrl.Validate= function(){
  //Do some more stuff
  this.someProperty = "validation ok";
}
1 голос
/ 08 августа 2010

В этом блоге описывается проблема, с которой вы столкнулись. Объявление 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. Однако эта проблема мучает большинство языков сценариев с поддержкой замыканий.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...