次のコードの範囲に頭を悩ませていると思います。
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の内部関数とオブジェクトは親のスコープと変数を追跡しないのですか?