繁体   English   中英

杀死运行无限的JavaScript函数

[英]Killing a JavaScript function which runs infinite

举个例子

var runInfinite = function(){
    while(1)
    {
       // Do stuff;
    }
};

setTimeout(runInfinite, 0);

是否有可能打破运行无限的runInfinite函数形式? 我的意思是可以在不使用flag或return语句的情况下从另一个函数中删除此函数吗?

答案是不。 由于JavaScript是单线程的(除非你使用一些不太常见的实现,我怀疑)没有什么可以从外部破坏循环(或任何其他代码块)。

没有直接的方法可以“杀死”正在运行的javascript函数。

可能的解决方法,虽然您需要替换while(1)循环:

var i = 0; // for testing purposes

var toCall = "runInfinite()";
function runInfinite(){
    // do stuff
    console.log(i++);
    setTimeout(function(){ eval(toCall); }, 100); // or whatever timeout you want
}

setTimeout(function(){ eval(toCall); }, 0); // start the function
setTimeout(function(){ toCall = ""; }, 5000); // "kill" the function

我知道使用eval()被认为是不好的做法,但是这个想法应该是明确的。 该函数使用toCall变量调用自身(不是递归的,因此是setTimeout() )。 一旦取消设置此变量,就可以从外部删除它。

您可以将这些变量和函数包装在一个类中,这样就可以实现“kill”功能。

我刚刚在浏览器上测试过。

AFAIK,while(1)块将字面上阻止线程,不允许任何其他运行。 我没有经验以外的其他来源,但使用Chrome开发人员工具包的事情ctrl+shift+i输入while(1){}将阻止其他所有内容,因为browser-javascript是单线程的。

但是,如果您正在使用node.js ,则可能因为它具有多线程功能。 如果有人对node.js足够熟悉并愿意回答/编辑,那就去吧。 我从未使用过它。

你想要的不是真的。 但也许你做错了。 尽量不要使用while(1)如果可能,并且在函数结束时再次调用函数,如果外部标志被触发但是没有设置某个break按钮,或者如果否则返回

return可用于从当前执行中停止函数,但不能用于您的情况。

在你的情况下,你可以尝试将你的函数包装在try / catch块中 ,你可以在你的函数无限时找到它,基于你可以终止它的当前执行。

我承认这不完全相同,但是, ECMA-262中有Javascript生成器和Javascript迭代器。 如果您可以使用生成器功能替换您的功能,则可以轻松实现易碎功能。

 function execWithTimeout(iter, timeout = 100) { const limit = Date.now() + timeout for (const output of iter) { console.log(output) if (Date.now() > limit) throw(new Error("Timeout reached")) } } let runInfinite = function * () { let i = 0 while (1) { yield i++ } } execWithTimeout(runInfinite()) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM