Javascript,嵌套的事件处理程序和这个

时间:2012-11-01 22:28:55

标签: javascript node.js this

我有这个javascript类:

var Server = (function () {

var spawn = require('child_process').spawn;

function Server(serverDefinition) {
    this.definition = serverDefinition;
    this.status = false;
}

Server.prototype.start = function () {
    this.process = spawn('java', ['-jar', this.definition.jarfile]);
    this.status = true;

    this.process.on('exit', function(code, signal){
        this.status = false;
        console.log('Server stopped: code=' + code + ', signal=' + signal);
    });

    this.process.stdout.on('data', function(data){ console.log('stdout: ' + data);});
    this.process.stderr.on('data', function(data){ console.log('stderr: ' + data);});
};

return Server;

})();

我的问题是this内的this.process.on('exit', ... )引用了process,而不是Server,我希望如此。

处理此案件的最佳模式是什么?一个_self = this?在这种情况下,应该在哪里插入该行,我应该停止引用this并仅使用_self吗?

1 个答案:

答案 0 :(得分:2)

你可以创建一个局部变量来保存对函数作用域中this的引用,这是有效的,因为在JavaScript中,变量的作用域是由它在源代码中的位置和嵌套函数定义的可以访问在其外部范围内声明的变量。[1]

Server.prototype.start = function () {
    var serv = this; // Reference to local object for use in inner-functions

    this.process = spawn('java', ['-jar', this.definition.jarfile]);
    this.status = true;

    this.process.on('exit', function(code, signal){
        serv.status = false;
        console.log('Server stopped: code=' + code + ', signal=' + signal);
    });

    this.process.stdout.on('data', function(data){ console.log('stdout: ' + data);});
    this.process.stderr.on('data', function(data){ console.log('stderr: ' + data);});
};

在我看来,最好的做法是继续引用this尽可能明确你所指的内容,可能会错过重新分配使用的局部变量,同时调试使其很难找到错误。