Показать сообщение отдельно
  #1 (permalink)  
Старый 28.06.2011, 18:08
Аватар для cmygeHm
Профессор
Отправить личное сообщение для cmygeHm Посмотреть профиль Найти все сообщения от cmygeHm
 
Регистрация: 12.10.2010
Сообщений: 196

указатель this
Hello world!
Научите! как быть. Тут и JavaScript и JQuery.
Тема названа так, потому что другого названия придумать не мог. Также жду Ваших вариантов - как можно было назвать тему.
Имеем:
function MyObj () {

    this.func1 = function() {
        console.log(5);
    }
    
    this.func2 = function() {
        this.func1();
    }
    
    this.func3 = function(b) {
        console.log(b);
    }
    
    this.doAjax = function(fn) {
       
       $.ajax({
           url: '/mashines/index/getmashines/format/json',
           dataType: 'json',
           data: {'start': 0, 'limit': 50},
           assync: false,
           success: function(data) {
               fn(data);
           }

        });
   }
   
   this.errorFunc = function() {
       this.doAjax(function(a){
           console.log(a); // выводит отлично!
           this.func3(a); /* а здесь ошибка:
                      Uncaught ReferenceError: func3 is not defined - если без this обращаюсь к func3 и 
                      Object [object DOMWindow] has no method 'func3' - если через this*/
       });
   }
}


var myObj = new MyObj();
myObj.func1(); // вызывается отлично
myObj.func2() //вызывается отлично
myObj.errorFunc(); // бум!


Как я понимаю, при обращении к this.func3 внутри анонимной функции я обращаюсь к this объекта аjax. Там функция func3 не находится и он ищет в prototype объектов выше, и доходит до window! А там его тоже нет! Как же обратиться к методу??? Можно извращаться, но это по-моему не дело:

this.doAjax = function(fn) {
       var self = this;  // сохраняем this в self
       $.ajax({
           url: '/mashines/index/getmashines/format/json',
           dataType: 'json',
           data: {'start': 0, 'limit': 50},
           assync: false,
           success: function(data) {
               // и передаем его в fn
               fn(self, data);
           }

        });
   }
   
   this.errorFunc = function() {
       this.doAjax(function(mySelf, a){
           console.log(a);
           mySelf.func3(a);
       });
   }

Последний раз редактировалось cmygeHm, 28.06.2011 в 18:14.
Ответить с цитированием