杀死运行无限的JavaScript函数

时间:2013-02-14 08:28:03

标签: javascript javascript-events

作为一个例子

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

setTimeout(runInfinite, 0);

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

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

没有直接的方法来“杀死”正在运行的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()被认为是不好的做法,但这个想法应该是明确的。该函数使用setTimeout()变量调用自身(不是递归,因此toCall)。一旦取消设置此变量,就可以从外部删除它。

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

答案 2 :(得分:1)

我刚在浏览器上测试过。

AFAIK,while(1)块将逐字地阻塞线程,不允许其他任何东西运行。除了经验之外,我没有其他来源,但是使用Chrome开发人员工具包ctrl+shift+i输入while(1){}会阻止其他所有内容,因为浏览器-javascript是单线程的。

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

return 可用于停止当前执行的功能,但不适用于您的情况。

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

答案 5 :(得分:0)

我承认这并不完全相同,但是ECMA-262中有Generator Function。如果您可以将函数替换为生成器函数,则可以轻松实现易碎功能。

function execWithTimeout(gen, timeout = 100) {
    const limit = Date.now() + timeout
    for (const output of gen()) {
        console.log(output)
        if (Date.now() > limit) throw(new Error("Timeout reached"))
    }
}

let runInfinite = function * () {
    let i = 0
    while (1) {
        yield i++
    }
}

execWithTimeout(runInfinite)