Почему передача this.method в качестве параметра не работает?
-
21-12-2019 - |
Вопрос
В классе, представляющем запрос, я пытаюсь обработать его с помощью Q-промисов и после этого имею два простых обработчика для отправки результата обработки.Почему это не работает:
Request.prototype.process = function() {
var that = this;
return that.getParameter('method')
.then(function(method) {
// ... Some processing
})
.then(that.replyOK)
.fail(that.replyError);
};
Но это делает:
Request.prototype.process = function() {
var that = this;
return that.getParameter('method')
.then(function(method) {
// ... Some processing
})
.then(function(error) {
that.replyOK(error);
})
.fail(function(error) {
that.replyError(error);
});
};
Решение
JavaScript в основном имеет лексическую область видимости.Это означает, что в:
function foo(){
var that = this;
//...
}
Переменные, обращающиеся к этому в следующих строках foo that
установлено то, что вы ожидаете.Если вы передаете функции с локальными значениями, определяемыми в другом месте, that
не будут зафиксированы в своей лексической (переменной) среде.
В JavaScript также есть динамические this
, метод this
определяется вызывающим в данный момент объектом.Например:
var a = {
x:3,
getX:function(){ return this.x; }
};
var b = {x:5};
b.getX = a.getX;
b.getX(); // returns 5
a.getX(); // returns 3
a.getX.call(b); // set `this` explicitly with .call, returns 5
var x = a.getX;
x(); // global x or undefined.
Это возможно зафиксировать this
с использованием Function.prototype.bind
как таковой:
Request.prototype.process = function() {
return this.getParameter('method')
.then(function(method) {
// ... Some processing
})
.then(this.replyOK.bind(this))
.fail(this.replyError.bind(this));
};
Или, в синтаксисе EcmaScript 6 (пока недоступен в узле, но скоро):
Request.prototype.process = () => { // arrow functions have lexical `this`
return that.getParameter('method')
.then(function(method) {
// ... Some processing
})
.then(this.replyOK)
.fail(this.replyError);
};