首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么为同一函数调用window.setTimeout不会引入无限循环?

为什么为同一函数调用window.setTimeout不会引入无限循环?
EN

Stack Overflow用户
提问于 2016-09-03 04:52:06
回答 4查看 98关注 0票数 0

我看到了以下代码:

代码语言:javascript
复制
class MasterControlPanel {
    private sensors: Sensor[] = [];
    constructor() {
        // Instantiating the delegate HeatSensor
        this.sensors.push(new HeatSensor(this));
    }

    start() {
        for (var i= 0; i < this.sensors.length; i++) {
            // Calling the delegate
            this.sensors[i].check();
        }
        window.setTimeout(() => this.start(), 1000);
    }

    startAlarm(message: string) {
        console.log('Alarm! ' + message);
    }
}

var cp = new MasterControlPanel();
cp.start();

为什么window.setTimeout(() => this.start(), 1000);不引入无限循环?

根据我的理解,cp.start()将首先迭代sensors中的每个sensor,然后调用window.setTimeout,后者在1第二次延迟后再次调用start

参考:清单3-3。专业TypeScript中的委派:应用程序规模的JavaScript开发

EN

回答 4

Stack Overflow用户

发布于 2016-09-03 05:02:37

简而言之,它不会引入无限循环,因为setTimeout不会阻塞。相反,您赋予它执行的函数() => this.start()将被添加到队列中,并在1秒后执行。start方法在调用window.setTimeout之后返回,因此不会导致命令式意义上的无限循环。大多数情况下,代码将处于等待状态,直到下一个计时器到来。

代码无限地调度一个计时器来调用start方法也是正确的,但它不是无限循环,因为它将控制权返回给javascript运行时。

票数 2
EN

Stack Overflow用户

发布于 2016-09-03 05:00:26

它确实引入了一个无限循环,每次调用之间延迟1秒

代码语言:javascript
复制
window.setTimeout(() => this.start(), 1000);

几乎与

代码语言:javascript
复制
var _this = this; 
window.setTimeout(function(){ _this.start(); }, 1000);

它被称为Arrow Function

票数 1
EN

Stack Overflow用户

发布于 2016-09-03 04:55:11

也许你需要setInterval。这将创建一个无限循环,您可以使用clearInterval清除该循环。

代码语言:javascript
复制
this.interval = window.setInterval(() => {
...
}, 5000);

window.clearInterval(this.interval);

你也可以这样做

代码语言:javascript
复制
this.sensors.forEach(sensor => sensor.check())

而不是使用for循环。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39300551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档