如何编写⼀个前端框架之三-代码运
⾏沙箱(译)
2018 年 04 ⽉ 17 ⽇
本系列⼀共七章,Github 地址请查阅这⾥,原⽂地址请查阅这⾥。
沙箱中代码求值
这是编写⼀个前端框架系列的第三章,本章我将会阐述浏览器端不同的代码
求值的⽅法及其所产⽣的问题。我也将会介绍⼀个⽅法,它依赖于⼀些新颖
或者少见的 JavaScript 功能。
邪恶的 eval
eval() 函数⽤于对字符串形式的 JavaScript 代码进⾏求值。
代码求值的最常见的解决⽅案即使⽤ eval() 函数。由 eval() 执⾏的代码能
够访问闭包和全局作⽤域,这会导致被称为代码注⼊ code injection 的安全隐
患,正因此让 eval() 成为 JavaScript 最臭名昭著的功能之⼀。
虽然让⼈不爽,但是在某些情况下 eval() 是⾮常有⽤的。⼤多数的现代框
架需要它的功能,但是因为上⾯提到的问题⽽不敢使⽤。结果,出现了许多
在沙箱⽽⾮全局作⽤域中的字符串求值的替代⽅案。沙箱防⽌代码访问安全
数据。⼀般情况下,它是⼀个简单的对象,这个对象会为求值代码替换掉全
局的对象。
常规⽅案
替代 eval() 最常见的⽅式即为完全重写 - 分两步⾛,包括解析和解释字符
串。⾸先解析器创建⼀个抽象语法树(AST),然后解释器遍历语法树并在
沙箱中解释为代码。
这是被最为⼴泛使⽤的⽅案,但是对于如此简单的事情被认为是⽜⼑⼩⽤。
从零开始重写所有的东西⽽不是为 eval() 打补丁会导致易出很多的 bug,
评论0