2015-12-09 4 views
1

Итак, у меня есть класс с несколькими методами, один из методов используется как обратный вызов. Но в зависимости от того, как я объявляю обратный вызов, указатель this имеет коммутируемый контекст. Мне интересно, как сделать эту работу, где указатель this - это сам объект.Переключение контекста внутри объекта - ссылаясь на «это» в обратном вызове

Пример моего вопроса:

return { 
    init: function(){ 
     this.starting = 0; 
     var _this = this; 
     $.ajax({/* some params */}) 
     .done(function(response){ 
      _this.addOne(); // here the context is fine, one gets added 
     }) 
     .fail(_this.subtractOne); // the callback points to the function below, 
            // but 'this' doesn't point to the same thing 
    }, 
    addOne: function(){ 
     this.starting++; 
    }, 
    subtractOne: function(){ 
     this.starting--; 
    } 
} 

Как я могу использовать обозначения, что .fail использует, но все-таки вычитать правильно?

+0

Посмотрите в использовании [Связанная] (https://developer.mozilla.org/ en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind), который позволяет вам выбрать значение 'this', которое вы хотите использовать в функции, которую вы вызываете. – saadq

+0

Вы должны использовать тот же синтаксис, который вы использовали для вашего завершенного вызова, т.е. '.fail (function() {_this.subtractOne();})' – Stouffi

+0

@Stouffi, я понимаю, какой синтаксис работает, это всего лишь надуманный пример чтобы у меня проблема. – SoluableNonagon

ответ

3

Поскольку this определяется как функция называется, а не как это написано.

JQuery называет его функция обратного вызова с this связана с любым смыслом JQuery в данный момент (например, для обработчиков событий, this привязан к элементу DOM, вызвавшему событие).

Из-за этого this в this.starting-- не так, как вы думаете.

Вы можете заставить this быть все, что вы хотите, передавая результат .bind() на вашей функции, например, так:

.fail(_this.substractOne.bind(_this)); 
+0

Спасибо, это то, что я искал. – SoluableNonagon

3

bind() будет убедиться, что вызов сделан с надлежащей this ссылки:

.fail(_this.subtractOne.bind(_this)); 
Смежные вопросы