Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过内存停止javascript中的无限循环?_Javascript - Fatal编程技术网

如何通过内存停止javascript中的无限循环?

如何通过内存停止javascript中的无限循环?,javascript,Javascript,我有一个编辑器,用户可以通过它输入javascript并显示输出。但是我想要一个安全条件来阻止他们意外地创建一个无限循环。问题是我真的不想解析代码,寻找任何循环,然后添加额外的条件。我所希望的是一个预构建的函数,在一定的内存量后自动取消,以避免浏览器崩溃。但是,我不确定如何做到这一点。在JavaScript本身中没有通用的方法来做到这一点,因为浏览器中的JavaScript是单线程的。*如果恶意脚本从未产生,那么您的代码就没有机会运行–杀死用户的脚本 在某些情况下,运行时可以为您做到这一点——I

我有一个编辑器,用户可以通过它输入javascript并显示输出。但是我想要一个安全条件来阻止他们意外地创建一个无限循环。问题是我真的不想解析代码,寻找任何循环,然后添加额外的条件。我所希望的是一个预构建的函数,在一定的内存量后自动取消,以避免浏览器崩溃。但是,我不确定如何做到这一点。

在JavaScript本身中没有通用的方法来做到这一点,因为浏览器中的JavaScript是单线程的。*如果恶意脚本从未产生,那么您的代码就没有机会运行–杀死用户的脚本

在某些情况下,运行时可以为您做到这一点——Internet Explorer以其独特的性能而臭名昭著,但我不知道有任何平台无关的方式来请求环境保护

*忽略与讨论无关的web Worker,因为消息处理始终发生在主线程中。

运行一个名为“您可以使用它”的开源项目,它很容易实现


最干净的解决方案可能是解释JavaScript。这就是为什么,当你做无限循环时,会有非常好的反馈。var f=函数{f;};F生成此输出:RangeError:超出最大调用堆栈大小

JS解释器似乎正在用Acorn JS解释JavaScript,您可能可以添加对无限循环的检测:

另一种选择是使用Web Workers:

使用服务器端的某些东西将用户的脚本移动到Web workers中。您还可以使用如下MDN示例中的数据URI:。但是,由于安全限制,数据URI在IE中无法工作

重写console.log、alert或用户需要的任何其他内容,以便从脚本中获取反馈,将其转换为Web worker消息

在预设的时间后杀死每个Web工作人员


我认为这个可以帮助你:它解释了当你创建无限循环时会发生什么,以及如何通过browser@MrJedi这几乎无关紧要。虽然rue{}不会引发错误,但您可以处理它。我不知道循环保护。不幸的是,它不能处理递归。是的,有JavaScript解析器的帮助,这是可能的。对于无限递归的情况来说,似乎不那么重要,因为脚本只会在出现过多递归错误的瞬间失败,所以它不会崩溃或冻结浏览器。OP说我真的不想解析代码,寻找任何循环,然后添加额外的条件。OP希望预构建的函数在一定的内存量后停止,我不认为JS中有这样的预构建,所以我只是建议。