gpt4 book ai didi

Node.js 伪类中的递归 setTimeout()

转载 作者:太空宇宙 更新时间:2023-11-04 03:11:31 25 4
gpt4 key购买 nike

我认为我很难理解以下代码的范围:

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();

最终发生的情况是,“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 中的内部函数和对象是否不跟踪其父级的作用域和变量?

最佳答案

您最初的问题是您在 setTimeout调用 this.tick:

setTimeout(this.tick(), this.time);

相反,您希望将引用传递给this.tick函数:

setTimeout(this.tick, this.time);

这解决了第一个循环的问题,但对 tick 的第二次调用(来自 setTimeout)未绑定(bind)到正确的范围;因此,您可以使用 bind 将函数引用绑定(bind)到 this 的当前值:

setTimeout(this.tick.bind(this), this.time);

(如果您愿意,也可以使用 self 技巧。)

所以,完整的工作程序是:

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.bind(this), this.time);
};
}

util.inherits(Ticker, EventEmitter);

var newTicker = new Ticker(1000);

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

newTicker.tick();

关于Node.js 伪类中的递归 setTimeout(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16500514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com