非严格模式下普通函数调用时this默认绑定全局对象(浏览器为window,node.js为global),严格模式下则为undefined;显式绑定、箭头函数及对象方法调用行为在两种模式下一致。

普通函数调用时,this 的行为在严格模式与非严格模式下有本质区别:关键在于它是否默认回退到全局对象。
非严格模式下 this 指向全局对象
函数直接调用(如 fn()),且未启用严格模式时,this 会自动绑定到全局对象:
- 浏览器中是
window - Node.js 中是
global - 即使函数在模块外、脚本顶层定义,只要没写
"use strict",this 就不是undefined
这种隐式绑定容易导致意外修改全局属性,比如 this.name = "test" 实际改了 window.name。
严格模式下 this 为 undefined
只要函数体或所在脚本启用了严格模式("use strict"),普通调用时 this 就是 undefined:
-
function fn() { "use strict"; console.log(this); } fn();→ 输出undefined - ES 模块(
.mjs或<script type="module"></script>)天然严格模式,顶层this也是undefined - 读取
this.xxx会直接报错(如Cannot read property 'xxx' of undefined),而不是静默返回undefined
显式绑定不受模式影响,但 null/undefined 处理更一致
call、apply、bind 依然可以设置 this,但严格模式让它们对 null 和 undefined 的处理更可靠:
- 非严格模式:
fn.call(null)会把null自动转成window - 严格模式:
fn.call(null)真的用null作为 this;fn.call(undefined)也真的用undefined
箭头函数和方法调用保持原逻辑
这两类行为在两种模式下完全一致:
- 箭头函数不绑定 this,始终继承外层词法作用域的 this 值
- 对象方法调用(
obj.method())时,this 仍指向点号左侧的对象,与是否严格无关 - 真正暴露问题的是“方法被提取后调用”——
const f = obj.method; f();在严格模式下立即得undefined,而非悄悄指向window
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











