0

私はこの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', ... )参照していることです。processServer

このケースに対処するための最良のパターンは何ですか? _self = this? _ その場合、その行はどこに挿入する必要があり、参照をやめて代わりにthisのみ使用する必要がありますか?_self

4

1 に答える 1

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です。デバッグ中に使用されたローカル変数の再割り当てを見逃す可能性があり、エラーを見つけるのが難しくなります。

于 2012-11-01T22:56:48.723 に答える