用途

在隔离环境中,用以测试不受信任的文件或运行用户输入等行为的工具

实现原理

构建with块级作用域限制局部变量

with语句 能改变变量的作用域链,使得程序在查找变量值时,都是先在with指定的对象中查找,然后再往上查找

使用ES6的Proxy限制变量向上查找

Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程。Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。Proxy 这个词的原意是代理,用在这里表示由它来“代理”某些操作,可以译为“代理器”。

当with块级作用域内的调用某一变量时,若此变量在sanbox中有定义,返回sandbox中的定义,否则直接返回undefined。这样起到了隔离代码执行环境的作用

结果返回

在sandbox中预设某个变量用于接收执行代码的返回值。这里是我的实现,不太优雅,酌情使用。

实现代码

// 给多个sanbox做一个缓存
sandboxProxies = new WeakMap()runInSandBox (src : string) {src = 'with (sandbox) { ' + src + '}'const code = new Function('sandbox', src)function has (target, key) {  return true}function get (target, key) {  if (key === Symbol.unscopables) return undefinedreturn target[key]}return (sandbox) => {if (!sandboxProxies.has(sandbox)) {const sandboxProxy = new Proxy(sandbox, { has, get })sandboxProxies.set(sandbox, sandboxProxy)}let sbp : any = sandboxProxies.get(sandbox)code(sbp)return sbp}
}

调用方法

let sandbox = {window: {},Object,JSON,Math,console,document,returnData: {}
}
let code = "returnData = { 'a': 'hello world' }"
let d = runInSandBox(code)(sandbox)
console.log(d.returnData)

Javascript创建沙箱相关推荐

  1. 使用Javascript创建XML文件

    使用Javascript创建XML文件 出处:http://blog.csdn.net/sutao_713/article/details/1908431          在客户端创建XML文件可以 ...

  2. JavaScript创建或填充任意长度的数组

    JavaScript创建或填充任意长度的数组 直接填充法 const arr = [0,0,0]; Array 构造函数 var len = 3; var arr = new Array(len); ...

  3. Google Map API使用详解(十)——使用JavaScript创建地图详解(上)

    在网页MyTest1.html中我们已经使用了JavaScript来创建地图,下面总结一下使用JavaScript创建一个地图的核心步骤: 1.  导入地图API类库. <script src= ...

  4. arcgis api for javascript创建webscene

    arcgis api for javascript创建webscene,核心代码如下: esriConfig.portalUrl = this.config.portal; var scene = n ...

  5. javascript创建类_如何使用JavaScript创建吹气效果

    javascript创建类 Have you ever wondered how you can create a realistic air blowing effect with JavaScri ...

  6. javascript创建类_如何在10分钟内使用JavaScript创建费用管理器

    javascript创建类 by Per Harald Borgen 通过Per Harald Borgen 如何在10分钟内使用JavaScript创建费用管理器 (How to create an ...

  7. Javascript 创建书签小工具 (bilibili视频下载为例)

    书签小工具(Bookmarklets)是一个非常棒的javascript代码小片断伪装成的小应用,它驻留在你的浏览器里并为网页提供额外的功能.这里我们将研究如何从头开始创建一个书签小工具及一些最佳实践 ...

  8. 使用 Javascript 创建和生成 UUID

    通用唯一标识符 (UUID) 在软件开发中无处不在,用于从识别对象元素到网页上的 DOM 元素的所有内容. 它们是唯一的 128 位标识符,由格式的 36 个字符组成 . 例如 UUID 通常不依赖于 ...

  9. 使用 HTML CSS 和 JavaScript 创建星级评分系统

    各位读者好,今天在本博客中,您将学习如何使用 HTML CSS 和 JavaScript 创建星级评分系统 (Widget).早些时候,我还分享了一篇关于Star Rating Widget 的博客, ...

最新文章

  1. [转]WinXP、Win7脚本自动加域及用户资料迁移
  2. 7限制cpu使用_Kubernetes 资源配额使用指南 | Linux 中国
  3. 【链表】逆序打印链表
  4. jqGrid 常用方法
  5. System.Web.HttpContext.Current.Session为NULL解决方法
  6. python判断密码强度_python – 检查密码的强度(如何检查条件)
  7. VS2013模块对于SAFESEH映像是不安全的解决方法
  8. 互联网公司端午节礼盒歧视指南
  9. 二叉搜索树的删除_LeetCode109.有序链表转换二叉搜索树
  10. IDEA运行java文件环境配置
  11. 基于DSP的主动降噪开发之三(CCS软件学习)
  12. 涂鸦赞助的500个开发套件,先到先得
  13. matlab怎么分析数据,MATLAB应用——数据分析与统计
  14. 汉堡按钮的制作以及其中的问题
  15. 你还在用canvas画爱心吗?看我让你的名字在星空绽放
  16. android 闪光灯 频闪,技术丨频闪人像的闪光灯调节和拍摄要点
  17. 什么是贴片元器件,有哪些优缺点和种类
  18. EIGRP理论详解及基础实验
  19. (十二)Linux设置定时任务及开机自启动
  20. sklearn_决策树

热门文章

  1. 转自第一财经日报——基亿传媒在中国实验“广告ZARA”
  2. amd linux 性能,AMD 780G芯片组Linux性能首测
  3. php 编码中文乱码转换
  4. 技能梳理28@在oled上控制一条狗的奔跑
  5. MHDD的使用图解教程
  6. IBM Storwize v3500存储故障维修支持
  7. iphone天气定位功能
  8. vue登录获取验证码
  9. 七-3-线性理解和内生性
  10. SQL注入攻防入门详解