作为一个例子
var runInfinite = function(){
while(1)
{
// Do stuff;
}
};
setTimeout(runInfinite, 0);
是否有可能打破运行无限的runInfinite函数形式?我的意思是可以在不使用flag或return语句的情况下从另一个函数 kill 这个函数吗?
答案 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)