在JavaScript Closure中使用'this'

时间:2014-12-10 13:48:03

标签: javascript

我正在使用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'.

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

谢谢!

1 个答案:

答案 0 :(得分: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);
    }
  }
  ...