高频访问变量应缓存为局部变量以减少作用域链遍历,如 const doc = document;避免 with 和带绑定名的 catch;优先传参而非依赖闭包;局部变量访问最快,循环中需缓存 arr.length。

高频访问变量的性能优化,核心在于减少作用域链遍历深度。JavaScript 每次读写变量都要从当前执行环境的活动对象(AO)开始逐层向上查找,越靠后的层级(比如全局)访问越慢。优化的关键不是避免作用域链,而是让常用变量“就近可得”。
把跨作用域变量缓存为局部变量
当函数频繁访问全局或外层作用域的变量(如 document、Math.random、自定义的全局配置对象),每次访问都触发完整链路查找。应提前将其赋值给函数内局部变量:
- ✅ 推荐写法:const doc = document; const now = Date.now; const config = window.APP_CONFIG;,后续全部使用 doc、now、config
- ❌ 避免重复写:document.getElementById、window.APP_CONFIG.apiHost 等跨作用域引用在循环或高频调用中出现多次
- 注意:缓存后变量值不会自动更新(如 document 是引用,缓存的是同一对象;但 Date.now 是函数,缓存后仍需调用 now())
避免动态增强作用域链的语法
某些语句会临时将新对象插入作用域链顶端,导致原本的局部变量被“压到第二层”,反而拖慢访问速度:
- with 语句:虽能简化 obj.prop 写法,但会使所有标识符先查 with 对象,再查 AO,破坏局部变量优先性 —— 已禁用在严格模式,应彻底弃用
- try/catch 的 catch 块:异常对象会被推入作用域链首位,块内访问局部变量变慢 —— 若无需捕获具体异常名,可用 catch { ... }(ES2019+)跳过绑定
合理利用闭包与参数传递
闭包会保留外层作用域的变量对象,若闭包内高频访问外层变量,其实质仍是跨作用域查找。更可控的方式是显式传参:
- 将需要高频使用的外层值作为参数传入内层函数,使其成为该函数的局部变量
- 例如:不依赖闭包捕获 baseUrl,而写成 function makeRequest(url, baseUrl) { return baseUrl + url; }
- 对定时器、事件回调等异步场景,用 IIFE 或箭头函数绑定时,也优先传入所需值而非依赖外部作用域
优先使用字面量和局部声明
访问速度排序一般为:局部变量 ≈ 函数参数 > 闭包变量 > 全局变量。因此:
- 计算结果、正则表达式、常量对象等,尽量在函数顶部用 const 声明为局部变量,而非反复构造或从全局取
- 避免在循环中重复访问 arr.length,可提前缓存:for (let i = 0, len = arr.length; i
- 对象属性访问比变量慢,高频使用的属性(如 elem.style)也可缓存为局部变量
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











