【问题标题】:Using 'this' in a JavaScript Closure [duplicate]在 JavaScript 闭包中使用“this”[重复]
【发布时间】:2014-12-10 13:48:02
【问题描述】:

我正在用 JavaScript 构建一个应用程序。我试图弄清楚如何在 JavaScript 闭包中使用this。目前,我有以下代码:

var ExternalResource = require('ExternalResource');
function MyObject() {
}

MyObject.prototype.state = "Closed";
MyObject.prototype.execute = function(options, callback) {
  if (!options) {
    if (callback) {
      callback(-1);
    }
    return;
  }

  try {
    this.state = 'Connecting';
    var client = new ExternalResource.Client();
    client.connect(function(err) {
      if (err) {
        this.state = 'Failed';
        if (callback) {
          callback(-1, err);
        }
      } else {
        this.state = 'Good';
        if (callback) {
          callback(1);
        }
      }
    });
  } catch (ex) {
    if (callback) {
      callback(-1, ex);
    }
  }
};

我目前正在通过 Jasmine 测试执行 execute

it(' - Connect to a local instance', function(done) {
  var myObject = new MyObject();
  myObject.execute({}, function() {
    expect(myObject.state).toBe('Good');
  });
});

执行此测试时,我看到以下错误:

Expected 'Connecting' to be 'Good'.

我确信这与在 connect 回调中使用 this.state 有关。不过,我不确定。

谢谢!

【问题讨论】:

    标签: javascript


    【解决方案1】:

    您应该在外部范围内创建一个_self 引用,以便您可以在内部范围内正确使用它

    ...
    var _self = this;
    client.connect(function(err) {
      if (err) {
        _self.state = 'Failed';
        if (callback) {
          callback(-1, err);
        }
      } else {
        _self.state = 'Good';
        if (callback) {
          callback(1);
        }
      }
      ...
    

    【讨论】:

      猜你喜欢
      • 2018-09-26
      • 1970-01-01
      • 2010-09-25
      • 2017-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      相关资源
      最近更新 更多