为什么不通过that.method作为参数工作?

时间:2014-04-11 21:56:20

标签: javascript node.js promise q

在表示请求的类中,我尝试使用Q promises处理它,之后,有两个简单的处理程序来发送处理结果。为什么这不起作用:

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);
    });
};

1 个答案:

答案 0 :(得分:1)

JavaScript主要是词法范围。这意味着:

 function foo(){
     var that = this;
     //...
 }

在foo that的以下行中访问的变量设置为您期望的变量。如果传递函数并在其他地方定义了locals,则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);
};