性能eval 和 with 会在运行时修改或创建新的作用域 , 以此欺骗其他在书写时定义的词法作用域 。
你可能会问 , 那又怎么样呢?如果它们能实现更复杂的功能 , 并且代码更具有扩展性 , 难道不是非常好的功能吗?
答案是否定的 。
JavaScript 引擎会在编译阶段进行数项的性能优化 。 其中有些优化依赖于能够根据代码词法进行静态分析 , 并预先确定所有变量和函数定义的位置 , 才能在执行过程中快速找到标识符 。
但如果在引擎代码中发现了 eval 或 with , 它只能简单地假设关于标识符位置的判断都是无效的 , 因为无法在词法分析阶段明确知道 eval 会接收到什么代码 , 这些代码会如何对作用域进行修改 , 也无法知道传递给 with 用来创建新的词法作用域对象的内容到底是什么 。
最悲观的情况是如果出现了 eval 或 with , 所有的优化可能都是无意义的 , 因此最简单的方式就是完全不做任何优化 。
如果代码中大量使用了 eval 或 with , 那么运行起来一定非常的缓慢 。 无论引擎多聪明 , 试图将这些悲观的情况限制在最小范围内 , 也无法避免如果没有这些优化 , 代码会运行得更慢这个事实 。
- 微信|微信吃存储?教你 5 个方法给微信「瘦身」
- ios15|iOS 15.5 Beta1:建议看完果粉体验反馈再升级!
- 机器|找工作的朋友请注意,业内人士建议,尽量避免纯技术等3类工作
- 耳机|「2022年最新」非常适合通勤、上学和远程办公的9款顶级降噪耳机
- 自媒体|建议收藏,宝妈做自媒体第一个月累计1W,怎么找无版权素材的?
- 美团|美团亏损,转型在即
- ota|手机「早买早享受」的时代,已经过去了
- iOS|iOS15.4.1正式版发布,续航显著提升,建议所有用户升级
- iOS|iOS15.4.1发布:建议所有用户升级,我建议:别冲动
- GPU|预算不是很充足,但想体验到顶级旗舰机?建议看看去年的旗舰