严格模式下函数默认绑定使this为undefined,而非全局对象;需通过"use strict"声明或es6模块自动启用;仅影响默认绑定,不改变call/apply/bind、箭头函数或对象方法的this行为。

在严格模式下,函数的默认绑定(即独立调用时的 this)会变成 undefined,而不是非严格模式下的全局对象(如浏览器中的 window 或 Node.js 中的 global)。这是严格模式最直接、最明确改变 this 绑定的行为之一。
严格模式如何触发 this 为 undefined
只要函数在严格模式下执行,且未通过对象属性、call/apply/bind 或箭头函数等方式显式绑定 this,那么该函数内部的 this 就是 undefined。
- 函数声明或函数表达式顶部写
"use strict";,整个函数体进入严格模式 - 整个脚本开头加
"use strict";,所有函数默认在严格模式下运行 - ES6 模块(
.mjs或type="module"的 script)自动启用严格模式,无需手动声明
对比非严格模式的默认绑定
非严格模式下,独立调用函数时 this 指向全局对象:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
function foo() { console.log(this); }
foo(); // 浏览器中输出 window,Node 中输出 global
严格模式下,同样的调用会输出 undefined:
"use strict";
function foo() { console.log(this); }
foo(); // 输出 undefined
注意:箭头函数和 call/apply/bind 不受此规则“覆盖”
严格模式只影响「默认绑定」,不影响其他绑定方式:
- 箭头函数不绑定
this,它继承外层作用域的this,与是否严格无关 -
foo.call(obj)、foo.apply(null)、foo.bind({})()都由调用方式决定this,严格模式不会让它们变成undefined - 对象方法调用(如
obj.method())仍绑定到obj,不受严格模式影响
实际开发中的意义
把默认 this 设为 undefined 能提前暴露错误:
- 避免意外修改全局对象(比如误写
this.name = "xxx"却污染了window.name) - 让
this的行为更可预测,便于调试和静态分析 - 配合 TypeScript 或 ESLint(如
no-invalid-this)能更好识别未绑定的this使用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










