严格模式通过禁用with/eval、阻止隐式全局变量、明确this绑定及配合let/const,使作用域链固定、变量绑定可静态优化,从而间接提升词法查找效率。

严格模式本身不直接提升词法查找速度,但它通过消除某些运行时歧义和隐式行为,让引擎更容易做静态优化,从而间接加快变量访问效率。关键不在“加了'use strict'就变快”,而在于它为词法查找扫清了干扰项。
禁用 with 和 eval,稳定作用域链结构
在非严格模式下,with 和 eval 会动态改变当前作用域,导致引擎无法在编译/预解析阶段确定变量究竟落在哪一层作用域中,只能在运行时逐层试探查找——这严重拖慢词法查找。严格模式下,with 被完全禁止,eval 也不再能向当前作用域注入变量(它只能创建自己的独立作用域)。这意味着:
- 作用域链在函数定义时就完全固定,没有运行时突变
- V8 等引擎可安全地进行变量绑定内联(如把
outerVar直接编译为栈偏移量) - 避免了因作用域“不可预测”而被迫降级为慢路径查找
阻止隐式全局变量,减少全局对象污染
非严格模式下,未声明就赋值的变量(如 count = 10)会自动挂到 window 或 globalThis 上,变成全局属性。每次访问该变量,引擎必须先查当前作用域,查不到再查全局对象——而全局对象是个哈希表,属性访问比局部变量的栈/寄存器访问慢得多。严格模式下,这种写法直接抛出 ReferenceError,强制你显式声明:
- 用
let/const声明块级变量 → 查找只在当前及外层词法作用域中进行 - 用
var声明函数作用域变量 → 引擎可提前建立 AO(活动对象)映射 - 彻底杜绝“先查局部、再查全局”的两段式查找开销
明确 this 绑定,避免作用域链误判
虽然 this 不属于词法作用域,但它的不确定性会影响引擎对执行上下文的判断。非严格模式下,普通函数调用时 this 指向全局对象,容易与全局变量产生耦合;严格模式下,this 在非对象上下文中为 undefined,切断了变量访问与 this 的隐式关联。这使得:
- 引擎无需为“可能通过
this.prop访问变量”的情况保留额外查找路径 - 词法作用域链更“干净”,变量查找逻辑更线性、更可预测
- 配合
let/const使用时,TDZ(暂时性死区)行为也更一致,利于 JIT 编译器优化
配合 let/const 使用,启用更精准的作用域分析
严格模式虽不强制使用 let/const,但二者天然契合严格语义。相比 var 的变量提升和函数作用域,let/const 提供块级作用域和 TDZ,让引擎在解析阶段就能精确知道每个变量的生命期和嵌套层级:
- 块级作用域边界清晰 → 作用域链构建更轻量,查找路径更短
- 无变量提升 → 引擎无需预留未初始化槽位,变量位置可静态定位
- TDZ 保证访问顺序可控 → 避免因提前访问导致的运行时重查或异常分支
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











