嵌套箭头函数获取全局范围

时间:2017-01-04 20:06:17

标签: javascript ecmascript-6 es6-class

以下是代码的简化版本:

class Service {
    static _runRequest = (request, success, failure) => {
        request.then(
            (response) => {
                if (ResponseHelper.wasSuccessful(response)) {
                    success(response);
                }
                else if (ResponseHelper.wasUnauthorized(response)) {
                    SessionHelper.refreshCurrentSession().then(
                        (refreshResponse) => {
                            if (refreshResponse === true) {
                                this._runRequest(request, success, failure);
                            }
                        }
                    );
                }
            }
        );
    }
}

问题是,如果会话成功刷新,再次调用_runRequest时,this指向全局范围。

任何想法为什么以及如何解决这个问题?无论有多少嵌套函数,this都不应该保持不变?

1 个答案:

答案 0 :(得分:0)

在您的代码中this将是全局对象或undefined(取决于严格的设置和环境),与您所处的嵌套级别无关。就像执行时一样静态方法的第一行。

不使用箭头语法定义静态方法,而是使用更成熟,快捷的函数表示法:

static _runRequest(request, success, failure) { // ...etc

这将使this引用“类”对象。

请参阅下文,比较两种使用Babel定义静态方法的方法,使用简化代码(无嵌套,无承诺):

class Service1 {
    static _runRequest = (i) => {
        if (i == 0) {
          console.log('zero');
          return;
        }
        if (this && '_runRequest' in this) {
           return this._runRequest(0); // recurse
        }
        console.log('this is ' + this);
    }
}

Service1._runRequest(1);

class Service2 {
    static _runRequest(i) {
        if (i == 0) {
          console.log('zero');
          return;
        }
        if (this && '_runRequest' in this) {
           return this._runRequest(0); // recurse
        }
        console.log('this is ' + this);
    }
}

Service2._runRequest(1);