在一些应用中,咱们但愿给用户提供插入自定义逻辑的能力,好比 Microsoft 的 Office 中的 VBA
,好比一些游戏中的 lua
脚本,FireFox 的「油猴脚本」,可以让用户发在可控的范围和权限内发挥想象作一些好玩、有用的事情,扩展了能力,知足用户的个性化需求。安全
大多数都是一些客户端程序,在一些在线的系统和产品中也经常也有相似的需求,事实上,在线的应用中也有很多提供了自定义脚本的能力,好比 Google Docs 中的 Apps Script
,它可让你使用 JavaScript
作一些很是有用的事情,好比运行代码来响应文档打开事件或单元格更改事件,为公式制做自定义电子表格函数等等。闭包
与运行在「用户电脑中」的客户端应用不一样,用户的自定义脚本一般只能影响用户自已,而对于在线的应用或服务来说,有一些状况就变得更为重要,好比「安全」,用户的「自定义脚本」必须严格受到限制和隔离,即不能影响到宿主程序,也不能影响到其它用户。函数
而 Safeify 就是一个针对 Nodejs 应用,用于安全执行用户自定义的非信任脚本的模块。lua
咱们先看看一般都能如何在 JavaScript 程序中动态执行一段代码?好比大名顶顶的 eval
spa
eval('1+2')
上述代码没有问题顺利执行了,eval
是全局对象的一个函数属性,执行的代码拥有着和应程中其它正常代码同样的的权限,它能访问「执行上下文」中的局部变量,也能访问全部「全局变量」,在这个场景下,它是一个很是危险的函数。code
再来看看 Functon
,经过 Function
构造器,咱们能够动态的建立一个函数,而后执行它对象
const sum = new Function('m', 'n', 'return m + n'); console.log(sum(1, 2));
它也同样的顺利执行了,使用 Function 构造器生成的函数,并不会在建立它的上下文中建立闭包,通常在全局做用域中被建立。当运行函数的时候,只能访问本身的本地变量和全局变量,不能访问 Function 构造器被调用生成的上下文的做用域。如同一个站在地上、一个站在一张薄薄的纸上同样,在这个场景下,几乎没有高下之分。游戏