严格模式下函数独立调用时this值为undefined,禁止默认绑定到全局对象,避免隐式污染全局变量、提升可预测性与安全性。

严格模式通过让函数独立调用时的 this 值保持为 undefined,而不是自动绑定到全局对象(如浏览器中的 window),从而禁止默认绑定指向全局对象。
默认绑定在严格模式下的行为变化
在非严格模式下,函数独立调用(如 foo())时,this 会隐式绑定到全局对象;而启用严格模式后,这种隐式绑定被取消:
-
"use strict"后,function foo() { console.log(this); }执行时输出undefined - 若该函数试图访问
this.a,会立即抛出TypeError: Cannot read property 'a' of undefined - 这避免了意外读写全局变量(比如把
this.name = 'xxx'误当成给当前对象赋值,实则污染了window.name)
常见触发默认绑定的场景及严格模式效果
以下几种调用方式原本都属于“默认绑定”,严格模式统一让 this 为 undefined:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 直接调用函数:
foo() - 函数别名调用:
const bar = obj.foo; bar(); - 回调中传入方法:
setTimeout(obj.foo, 100); - IIFE(自执行函数)中未显式绑定:
(function(){ console.log(this); })();
如何正确启用并确保生效
必须让 "use strict" 在作用域顶部生效:
立即学习“Java免费学习笔记(深入)”;
- 整个脚本启用:放在文件第一行(或
<script>标签内首行) - 仅函数启用:在函数体第一行写
"use strict",该函数内所有代码受约束 - 注意:不能写在函数声明/表达式之前、不能被其他语句(包括注释前的空行)隔开,否则无效
为什么这能提升安全性
禁止默认绑定到全局对象,本质是切断“隐式全局污染”的路径:
- 防止
this.x = 1意外变成window.x = 1 - 让
this的值更可预测,便于调试和静态分析 - 配合
var/let/const显式声明变量,共同消除静默失败

















