JavaScript性能优化 - 慎用全局变量

137 阅读1分钟

在程序执行过程中如果针对某些数据需要进行存储,要尽可能的放在局部作用域当中作为一个局部变量。

为什么要慎用?

  • 全局变量定义在全局执行上下文,是所有作用域链的顶端:这个上下文也就是程序在查找数据过程中所有作用域链的最顶端,如果按照层级往上查找的过程来说,下面某些局部作用域没有找到的变量最终都会查找到当前最顶端的全局执行上下文。在这种情况下查找的时间消耗是非常大的,这样一来就降低了当前代码的执行效率;

  • 全局执行上下文一直存在与上下文执行栈,直到程序退出:在当前全局上下文当中定义的变量会一直存活于上下文执行栈,而这个上下文执行栈是直到当前程序退出之后才会消失的。这对于当前的 GC 工作来说也是非常不利的,因为只要我们的 GC 发现这样的一个变量还处于存活的状态,就不会把它当作垃圾对象进行回收。因此这样的做法也会降低我们当前的程序运行过程中对于内存的一个使用;

  • 如果某个局部作用域出现了同名变量则会遮蔽或污染全局:

    // 定义在全局环境下 var i, str = ''; for (i = 0; i < 1000; i++) { str += i } // 定义在局部变量中 for (let i = 0; i < 1000; i++) { let str = ''; str += i }