JavaScript性能优化:(二)作用域管理和对象访问

若说提高 JavaScript 程序性能,我们无法也不可能绕过作用域不谈。作用域对 JavaScript 有许多影响,从确定哪些变量可以被函数访问,到确定 this 的指向。JavaScript 作用域同整个程序的性能关系密切。JavaScript 中对象不同于传统面向对象程序设计语言,除去使用字面量方式声明对象不谈,我们有必要关注访问对象及其成员的性能问题。

作用域管理

基于对作用域、作用域链、标识符解析等的理解,我们应该遵循以下性能法则:

  • 应该尽可能地使用字面量,并减少数组项和对象成员的使用,因为访问字面量的速度最快,相反,访问数组元素和对象成员相对较慢
  • 应该尽可能地使用局部变量,由于局部变量总是存在于执行环境作用域链的最顶端,因此访问局部变量比访问跨作用域变量更快。变量在作用域中的位置越深,访问所需时间越长。由于全局变量总处在作用域链的最末端,因此访问速度也是最慢的
  • 在局部作用域中,最好使用局部变量缓存常用的跨作用域变量
  • 避免使用 try-catcht 语句、eval()with 语句,因为它们会产生动态作用域,从而改变执行环境的作用域链
  • 小心使用闭包,它同时关系到内存和执行速度

对象访问

通常来说,访问对象成员的速度比访问字面量或变量要慢,所以在访问对象及其成员,为了提高程序性能,我们应该遵循以下性能法则:

  • 嵌套的对象成员会显著地影响性能,应该尽量少用
  • 属性或方法在原型链中的位置越深,访问它的速度也越慢
  • 把常用的对象成员、数组元素、跨作用域变量缓存在局部变量中,以提高 JavaScript 性能,因为局部变量访问速度最快。

参考

  • 《高性能JavaSript》,[美]Nicbolas C.Zakas 著,丁琛 译,电子工业出版社 2015