如果我们需要执行用户写的代码,如和避免死循环?我们最近遇到了这个问题,因为写错代码很常见,所以我们进行了一下尝试。

首先我们需要使用iframe

这主要是安全考虑,我们需要一个sandbox环境来执行JavaScript,避免影响到整体。iframe的sandbox属性可以用来禁止弹窗等等,非常有用。

地址可以选择Blob url,不过blob url会持有当前web page的origin,如果用户拷贝一些乱七八糟的代码不小心执行的话,会有安全问题。所以最终决定用data URI。

iframe的执行仍然在同一个thread

iframe中执行了代码,发生死循环的时候,浏览器还是死掉了,因为iframe和parent还是在同一个thread。也就是说,我们无法在parent中进行timeout检测,因为检测代码在死循环发生时永远不会被执行。

Web Worker可行但不支持DOM API

如果是纯粹的JavaScript代码,或许用web worker可以,但是我们需要DOM API,所以Web Worker也不在考虑范围之中。

看来只能修改用户代码了

假设大多数死循环都是由while/for引起的,如果我们能插入一些代码并在每一次循环中进行检测,我们也许就可以根据某些条件提前终止循环。

比如这样的代码function abc() {

while (true) {

console.log(Date.now())

}

}

如果我们插入一个 __detectInfiniteLoop() 方法,并在while loop里面调用的话,就可以在loop 10000次的时候报错终止执行。let __count = 0

const __detectInfiniteLoop = () => {

if (__count > 10000) {

throw new Error('Infinite Loop detected')

}

__count += 1

}

function abc() {

while (true) {

console.log(Date.now())

__detectInfiniteLoop()

}

}

操作AST在合适位置插入代码

通过字符串匹配来编辑代码细节太复杂容易出错,我们可以用编辑AST的方式,实际上非常简单。

用到babel的3个package。

首先 parse用户的代码为ASTimport { parse } from '@babel/parser'

const ast = parse(code)

然后我们准备一下需要插入的代码。

代码有两部分,第一部分是function定义,实际上可以在头部插入,所以字符串就够了。第二部分是function的调用,这部分需要插入到AST中,所以也需要parse一下。const prefix = `

let __count = 0

const __detectInfiniteLoop = () => {

if (__count > 10000) {

throw new Error('Infinite Loop detected')

}

__count += 1

}

`

const detector = parse(`__detectInfiniteLoop()`)

接下来就找到 while/for/do..while 的位置,然后插入detector的调用。import traverse from '@babel/traverse'

traverse(ast, {

ForStatement: function (path) {

path.node.body.body.push(...detector.program.body)

},

WhileStatement: function (path) {

path.node.body.body.push(...detector.program.body)

},

DoWhileStatement: function (path) {

path.node.body.body.push(...detector.program.body)

}

})

AST修改好了,最后一步就是生成最终的代码,然后放到iframe中执行。import generate from '@babel/generator'

const newCode = prefix + generate(ast).code

如愿以偿!撒花!

最后

这个方法不是完美的,不过满足了我们自己的需求。你可以根据需要进行一下调整。

如果有更好的办法,欢迎评论告诉我们。

希望本文能帮助到你,下次再见!

js中while死循环语句_如何检测JavaScript中的死循环?相关推荐

  1. [转载] python中的且语句_简单探讨python中的语句和语法

    参考链接: 在Python中解包:并行分配之外 python程序结构 python"一切皆对象",这是接触python听到最多的总结了.在python中最基层的单位应该就是对象了, ...

  2. django中的for循环_深入了解 JavaScript 中的 for 循环

    在ECMAScript5(简称 ES5)中,有三种 for 循环,分别是: 简单for循环 for-in forEach 在2015年6月份发布的ECMAScript6(简称 ES6)中,新增了一种循 ...

  3. java中的感叹号是_[Java教程]javascript中的2个感叹号的用法

    [Java教程]javascript中的2个感叹号的用法 0 2014-04-15 19:00:09 !!是逻辑"非非",即是在逻辑"非"的基础上再" ...

  4. js数组查找最接近_如何从javascript中的对象数组中获取最接近的先前id

    我对您的代码进行了一些更改,现在应该可以正常工作了.看一看. const array = [{id:3}, {id:4}, {id:10}, {id:15}]; // you should order ...

  5. .Net 6.0中的新增特性_.Net 6.0中的新增功能

    .Net 6.0中的新增特性_.Net 6.0中的新增功能 一..Net 6 介绍 .NET 6 作为 LTS 长期支持版本,.NET 6 将会获得 3 年的技术支持. .NET 6 是首个原生支持 ...

  6. JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题的解决方法

    JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题的解决方法 参考文章: (1)JS IOS/iPhone的Safari浏览器不兼容Javascript中的D ...

  7. css如何保留空格,HTML/CSS中的空格处理_如何保留页面中的空格

    html中的空格的规则 在html中内容中的多个空格一般会被视为一个,连续的多个空格符被自动合并了.同时内容前后的空格也会被清除, 如下: fly63 com 显示效果为: fly63 com 备注: ...

  8. amp jsp空格 nps_HTML/CSS中的空格处理\_如何保留页面中的空格【转】

    HTML/CSS中的空格处理\_如何保留页面中的空格[转] HTML中的空格的规则 在html中内容中的多个空格一般会被视为一个,连续的多个空格符被自动合并了.同时内容前后的空格也会被清除, 如下: ...

  9. java引用类型和值类型_[Java教程]JavaScript中值类型和引用类型的区别

    [Java教程]JavaScript中值类型和引用类型的区别 0 2017-02-24 00:00:35 JavaScript的数据类型分为两类:原始类型和对象类型.其中,原始类型包括:数字.字符串和 ...

最新文章

  1. 前端入门(雷云特效,css)
  2. 『TensorFlow』第十一弹_队列多线程TFRecod文件_我辈当高歌
  3. 把接口作为函数的参数,那么任何实现了接口的类的实例都可以作为此函数的参数传递...
  4. Android 数据库升级解决方案
  5. Spring-data-redis集成提交数据出现'maxActive'和‘maxWaitMillis’错误
  6. ApacheCN 深度学习译文集 20210125 更新
  7. wpf 修改label值_c# – 在WPF中绑定Setter属性的值
  8. Windows 8 Directx 开发学习笔记(六)添加水模型
  9. WTA (winner-take-all) 与 自组织映射 SOM (self organizing map)的理解
  10. python正则表达式(1)--特殊字符
  11. android html片段,详解Android WebView加载html片段
  12. Springboot整合junit单元测试
  13. c语言 输出1到n之间的全部素数,输出1到n中所有的素数
  14. echarts 背景颜色 渐变色,阴影效果
  15. Luogu3403: 跳楼机
  16. MFC技术内幕系列之(二)---MFC文档视图结构内幕
  17. 电脑编程和计算机编程有什么区别,机器人编程与电脑编程有何区别?官方专家为你详细解说!...
  18. URL Schemes 的发展
  19. Python,字符串前缀u r b f
  20. 2021-2025年中国自动化侧面装载机行业市场供需与战略研究报告

热门文章

  1. php+高德地图webapi 高德jsapi 实现 当前位置与目标位置距离 并按照距离排序(坐标逆转换)...
  2. Excel导入导出帮助类
  3. C#空接合操作符——??
  4. VS2013/2012 下无法打开 源 文件“stdafx.h”的解决方法
  5. 关于VS2017编译UE4项目,输出窗口有乱码的解决方案
  6. webpack1.x环境配置与打包基础【附带各种 “坑“ 与解决方案!持续更新中...】
  7. Spring Boot统一异常处理实践
  8. 深度召回算法在字节跳动推荐系统的应用实践
  9. 【报告分享】2020中国时尚跨境电商发展报告.pdf(附下载链接)
  10. 『优势特征知识蒸馏』在淘宝推荐中的应用