严格模式下this默认为undefined,因执行上下文创建时即按规则确定值;非严格模式独立调用时this指向全局对象(如window),严格模式禁用隐式绑定以避免污染全局。

在严格模式下,JavaScript 中的 this 不再默认绑定到全局对象(浏览器中是 window),而是直接为 undefined。这不是“从 window 变成 undefined”的过程,而是**执行上下文创建时就按规则确定了 this 值**——严格模式改变了 this 的默认绑定规则。
严格模式如何影响默认 this 绑定
非严格模式下,函数独立调用(如 foo())时,this 会被自动绑定到全局对象(window)。严格模式禁用这一隐式绑定,让默认 this 保持为 undefined,避免意外污染全局或产生隐蔽 bug。
- 普通函数调用:
function foo() { console.log(this); } foo();→ 非严格模式输出window,严格模式输出undefined - 箭头函数不受此影响:它不绑定自己的
this,始终继承外层作用域的this值 - 构造函数调用(
new Foo())、显式绑定(call/apply/bind)、对象方法调用(obj.method())等场景,this行为在严格/非严格模式下一致
怎么启用严格模式
只需在脚本顶部或函数体开头添加 "use strict"; 字符串字面量:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 整个脚本启用:"use strict"; 放在文件第一行
- 仅对某个函数启用:function foo() { "use strict"; ... }
- ES6 模块(
.mjs或type="module")默认就是严格模式,无需手动声明
为什么设计成 undefined 而不是报错
这属于“静默失败”而非“抛错”,目的是让问题暴露在运行时(比如调用 this.xxx 时触发 Cannot read property 'xxx' of undefined),便于调试。相比非严格模式下默默绑定到 window 并可能意外修改全局变量,严格模式更早、更明确地揭示错误根源。
立即学习“Java免费学习笔记(深入)”;
常见陷阱与应对建议
-
事件回调中 this 丢失:DOM 事件处理函数默认以目标元素为
this,但若用箭头函数或解构赋值传入,需注意是否被包裹在非严格函数里 -
setTimeout 中的普通函数:
setTimeout(foo, 100)是独立调用,严格模式下this为undefined;可用setTimeout(() => foo(), 100)或setTimeout(foo.bind(obj), 100) -
第三方库兼容性:老库可能依赖
window作为默认this,混用严格模式时需检查或加 polyfill


















