While vs setTimeout in Javascript

While vs setTimeout in Javascript

本文关键字:Javascript in setTimeout vs While      更新时间:2023-09-26

我想弄清楚是否最好写一个while循环(这将运行很长一段时间)或在Javascript中的setTimeout函数。据我所知,由于JavaScript是单线程的,对于任何一个函数运行很长一段时间都是不好的,因为这意味着没有其他函数能够同时运行。因此,在我看来,setTimeout会更好。

(1)有人能证实一下以上是真的吗?

(2)会有一个堆栈溢出问题,如果我重复使用setTimeout,在下面的例子中?

function enqueueSomething() {
    doSomething();
    setTimeout(enqueueSomething);

while (true) { doSomething(); }
检查函数是否可以调用:Javascript (meagar's comment)

while (true)如果在Javascript中不以某种方式退出,将会创建一个无限循环。这就是为什么异步编程在javascript中非常流行的原因。

无论如何,你是正确的,setTimeout或setInterval将是理想的。如果你打算渲染一些东西,你的渲染循环应该使用requestAnimationFrame。

也有类似于线程的网络工作者,但是当你使用它们时,你会失去很多作用域(例如,窗口在网络工作者的作用域中变得未定义)。如果你需要卸载处理,并且可以将整个过程包含在一个简单的范围内(例如执行繁重的计算),webworker是很好的选择。

你是正确的,javascript是单线程的,而一个函数正在运行,没有其他函数可以运行。在浏览器中,这也意味着整个页面将冻结(用户不能输入、移动鼠标等)。

setTimeout是更好的选择。

While阻塞代码执行,您的代码将被困在那里,直到循环结束。可能会使浏览器过载,导致应用程序的选项卡崩溃。

setTimeout将创建执行代码的任务,并继续执行其余的代码。当在setTimeout执行函数时,它将停止执行setTimeout函数。

While循环将阻塞剩余的代码,直到完成,setTimeoutsetInterval不会。

While循环

while循环更适合你的代码,但正如许多人所说,它们可能会出现问题并永远持续下去。最好的办法是限制循环可以重复的次数:

var i = 0;
while (my_condition && i < 10000000) {
    i++;
}

这样,while循环就不会永远持续下去。

另一个问题是while循环是同步的,这意味着它们将阻塞代码流,直到它们完成。有时这是我们想要的行为,有时则不是。

递归函数

我倾向于使用递归函数,当满足特定条件时将重复

function recurse() {
    super_specific_condition && recurse();
}

动画/渲染

如果你正在做渲染/动画,你想使用requestAnimationFrame,它使用递归函数。


<标题> 多线程任务

Web worker也是一个选项,因为它们可以在单独的线程上运行。你可以在这里了解他们


<标题> 时机

使用setTimeout使用异步方法。setInterval可能更合适,它被设计为递归。

如果你打算使用setTimeout/Interval方法而没有延迟,你可能应该远离。


速度/结论

请注意,现在的计算机非常快,你几乎可以在瞬间递归10万次。关于所有关于递归/速度的问题。我总是说,用while和递归函数递归是最好的,如果你有> 100,000,你会有更大的问题,比如内存,如果你从服务器上得到它,服务器负载。

我会坚持递归函数,web工作者,或requestAnimatonFrame取决于你在做什么。只有当你要使用setTimeout/Interval延迟时,你才应该使用它(在我看来)

问题可能是:您喜欢递归还是重复?使用setTimeout告诉解释器完成你的代码,然后重新调用你的函数。默认的延迟值0实际上会变成几百毫秒,除了完成代码所需的时间(可能不多)。

然而,while循环递归地调用函数,将每次调用添加到堆栈中,直到最后一个返回。虽然它确实占用了一些内存,但速度要快得多。

另一个很大的区别是重复调用按被调用顺序操作全局变量,而递归调用…