严格模式通过报错阻止全局污染:未声明赋值即抛错;eval内var不泄漏;with被禁用;作用域由启用位置决定;esm默认启用;let/const强化块级隔离。

严格模式本身不“规避”污染,而是用报错的方式阻止污染发生。它不靠隔离或封装,而是从源头掐断隐式挂载全局的路径——变量没声明就赋值?直接报错;eval里用var?只在eval内部生效;with?根本禁用。关键不是“怎么绕开”,而是“怎么让它必须报错”。
启用方式决定保护范围
严格模式的作用域边界由启用位置决定,不是全局开关:
- 脚本级:文件最开头写
"use strict";,整份脚本受控 - 函数级:函数体第一行写
"use strict";,仅该函数内生效 - ESM模块(
.mjs或<script type="module"></script>)默认启用,无需手动加
让未声明赋值立刻失败
这是最直接的防护。非严格模式下count = 10会悄悄变成window.count;严格模式下这行代码执行即抛ReferenceError: count is not defined。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 所有新变量必须显式用
let、const或var声明 -
user.name = "Tom"允许(前提是user已存在且可写) -
score = 95禁止(score未声明)
约束 eval 和 with 的动态行为
这两类语法容易绕过静态作用域检查,严格模式对其做了硬性限制:
-
eval内部启用严格模式后,var x = 1只在eval作用域内有效,不会泄漏到外层 -
with被完全禁止,避免隐式扩展作用域链 - 可在
eval字符串开头加'use strict';强制其内部严格
配合 let/const 强化块级隔离
严格模式不改变var的变量提升行为,但和let/const搭配效果最佳:
-
if (true) { let x = 1; }→ 外部访问x报错,安全 -
if (true) { var y = 2; }→ 外部能访问y,仍可能污染(尤其在函数顶层) - 循环中用
let i,每次迭代创建独立绑定,避免闭包陷阱
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










