Почему передача this.method в качестве параметра не работает?

StackOverflow https://stackoverflow.com//questions/23023245

  •  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);
};
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top