0

次のコードの範囲に頭を悩ませていると思います。

var EventEmitter = require('events').EventEmitter, util = require('util');

// Here is the Ticker constructor:
var Ticker = function(time) {
    this.time = time;
    this.tick = function() {
        this.emit('tick');
        setTimeout(this.tick(), this.time);
    };
}

util.inherits(Ticker, EventEmitter);

var newTicker = new Ticker(1000);

newTicker.on('tick', function() { console.log("TICK"); });

newTicker.tick();

最終的に何が起こるかというと、setTimeout が実際にタイムアウトを 1 秒に設定することなく、「ティック」が何度も呼び出されてスタックがいっぱいになるということです。

何が起こっているのか説明してもらえますか?


EDIT:もう少し調べてみましたが、スコープの問題はまだわかりませんでした。

私がやったのは、問題に対して与えられた解決策に従うことでした。これは、setTimeout() を使用して解決しようとしました。

与えられた解決策は次のとおりです。

var EventEmitter = require('events').EventEmitter, util = require('util');

// Here is the Ticker constructor:
var Ticker = function(time) {
    var self = this;
    this.time = time;
    setInterval(function() {
        self.emit('tick');
    }, self.time);
};

util.inherits(Ticker, EventEmitter);

var ticker = new Ticker(1000);

ticker.on('tick', function() { console.log("TICK"); });

それは私にはもっと理にかなっています...私が今疑問に思っているのは、javascriptの内部関数とオブジェクトは親のスコープと変数を追跡しないのですか?

4

1 に答える 1