var|「建议收藏」词法作用域( 三 )


性能eval 和 with 会在运行时修改或创建新的作用域 , 以此欺骗其他在书写时定义的词法作用域 。
你可能会问 , 那又怎么样呢?如果它们能实现更复杂的功能 , 并且代码更具有扩展性 , 难道不是非常好的功能吗?
答案是否定的 。
JavaScript 引擎会在编译阶段进行数项的性能优化 。 其中有些优化依赖于能够根据代码词法进行静态分析 , 并预先确定所有变量和函数定义的位置 , 才能在执行过程中快速找到标识符 。
但如果在引擎代码中发现了 eval 或 with , 它只能简单地假设关于标识符位置的判断都是无效的 , 因为无法在词法分析阶段明确知道 eval 会接收到什么代码 , 这些代码会如何对作用域进行修改 , 也无法知道传递给 with 用来创建新的词法作用域对象的内容到底是什么 。
最悲观的情况是如果出现了 eval 或 with , 所有的优化可能都是无意义的 , 因此最简单的方式就是完全不做任何优化 。
如果代码中大量使用了 eval 或 with , 那么运行起来一定非常的缓慢 。 无论引擎多聪明 , 试图将这些悲观的情况限制在最小范围内 , 也无法避免如果没有这些优化 , 代码会运行得更慢这个事实 。