而Javascript中的vs setTimeout
我试图弄清楚,在Javascript中编写while循环(将运行很长一段时间)还是setTimeout函数更好。据我所知,由于JavaScript是单线程的,任何一个函数长时间运行都是不好的,因为这意味着没有其他函数能够同时运行。因此,在我看来,设置超时会更好 (1) 有人能确认上述情况属实吗 (2) 如果重复使用setTimeout,是否会出现堆栈溢出问题,如下面的示例所示而Javascript中的vs setTimeout,javascript,function,while-loop,stack-overflow,settimeout,Javascript,Function,While Loop,Stack Overflow,Settimeout,我试图弄清楚,在Javascript中编写while循环(将运行很长一段时间)还是setTimeout函数更好。据我所知,由于JavaScript是单线程的,任何一个函数长时间运行都是不好的,因为这意味着没有其他函数能够同时运行。因此,在我看来,设置超时会更好 (1) 有人能确认上述情况属实吗 (2) 如果重复使用setTimeout,是否会出现堆栈溢出问题,如下面的示例所示 function enqueueSomething() { doSomething(); setTime
function enqueueSomething() {
doSomething();
setTimeout(enqueueSomething);
vs
引文:从这里改编的代码:(meagar的评论)while(true)将创建一个无限循环,如果您不以某种方式在Javascript中退出它。这就是为什么异步编程在javascript中非常流行的原因
无论如何,您是正确的,setTimeout或setInterval都是理想的。如果计划渲染某些内容,则渲染循环应使用requestAnimationFrame
或者,有些webworker类似于线程,但是在使用它们时会丢失很多作用域(例如,window在webworker的作用域中变得未定义)。如果您需要卸载处理,并且可以将整个过程包含在一个简单的范围内(例如执行繁重的计算),那么Webworkers非常有用。而如果您没有在Javascript中以某种方式退出,那么(true)将创建一个无限循环。这就是为什么异步编程在javascript中非常流行的原因
无论如何,您是正确的,setTimeout或setInterval都是理想的。如果计划渲染某些内容,则渲染循环应使用requestAnimationFrame
或者,有些webworker类似于线程,但是在使用它们时会丢失很多作用域(例如,window在webworker的作用域中变得未定义)。如果您需要卸载处理,并且可以将整个过程包含在一个简单的范围内(例如执行繁重的计算),那么Webworkers非常棒。您可以正确地认为javascript是单线程的,当一个函数运行时,其他函数无法运行。在浏览器中,这也意味着整个页面将冻结(使用不能键入、移动鼠标等)
setTimeout
是一个更好的选择 javascript是单线程的,当一个函数运行时,其他函数不能运行,这是正确的。在浏览器中,这也意味着整个页面将冻结(使用不能键入、移动鼠标等)
setTimeout
是一个更好的选择 当
阻止代码执行时,您的代码将被困在那里,直到循环完成。可能会使浏览器过载,导致应用程序的选项卡崩溃
setTimeout
将创建任务来执行代码,并继续执行代码的其余部分。当在setTimeout
执行函数时,它将停止执行setTimeout
函数的操作
当
循环阻塞其余代码直到完成时,设置超时
和设置间隔
不要。当阻塞代码执行时,代码将被困在那里直到循环完成。可能会使浏览器过载,导致应用程序的选项卡崩溃
setTimeout
将创建任务来执行代码,并继续执行代码的其余部分。当在setTimeout
执行函数时,它将停止执行setTimeout
函数的操作
While
循环将阻塞其余代码直到完成,setTimeout
和setInterval
不要。While循环
虽然
循环会更适合您的代码,但正如许多人所说,它们可能会有问题并永远持续下去。最好的办法是限制循环可以重复的次数:
var i = 0;
while (my_condition && i < 10000000) {
i++;
}
动画/渲染 如果要渲染/动画,则需要使用使用“递归”函数的
多线程任务 Web工作者也是一个选项,因为他们可以在单独的线程上运行。你可以了解他们
时机 使用
setTimeout
使用异步方法setInterval
可能更合适,它被设计为递归
如果您打算毫不延迟地使用setTimeout/Interval
方法,您可能应该远离它
速度/结论 请注意,现在计算机速度非常快,几乎可以立即递归100000次。关于递归/速度的所有问题。我总是说,用
而用和递归函数递归是最好的,如果你有>100000个,你会有更大的问题,比如内存,如果你从服务器上得到它,服务器负载
我会坚持使用递归函数、web workers或RequestAnimationFrame,具体取决于您所做的工作。只有当您要使用带有延迟的setTimeout/Interval
时,才应该使用它(在我看来)While循环
虽然
循环会更适合您的代码,但正如许多人所说,它们可能会有问题并永远持续下去。最好的办法是限制循环可以重复的次数:
var i = 0;
while (my_condition && i < 10000000) {
i++;
}
动画/渲染
如果要渲染/动画,则需要使用使用“递归”函数的
多线程任务
Web工作者也是一个选项,因为他们可以在单独的线程上运行。你可以了解他们
时机
使用setTimeout
使用异步方法setInterval
可能更合适,它被设计为递归
如果您打算毫不延迟地使用setTimeout/Interval
方法,您可能应该远离它
速度/结论
请注意
function recurse() {
super_specific_condition && recurse();
}