我想我很难理解以下代码的范围:
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 实际上却没有将超时设置为一秒。
任何人都可以向我解释发生了什么事吗?
编辑:我看了一点,我仍然无法弄清楚范围的问题,真的。
我最终做的是遵循为问题提供的解决方案,我试图通过 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中的内部函数和对象是否不跟踪其父级的范围和变量?