严格模式下隐式绑定丢失时this为undefined,非严格模式则回退到全局对象;典型场景如方法赋值后调用、回调传参、显式绑定传null/undefined时行为不同,ES模块默认严格模式。

严格模式下,this 在隐式绑定丢失时是 undefined;非严格模式下则默认回退到全局对象(浏览器中为 window,Node.js 中为 global)。这是两者最直接、最关键的区别。
隐式绑定丢失的典型场景
当一个对象方法被提取为独立函数后调用,就发生隐式绑定丢失。此时不再有调用上下文,this 的取值取决于是否启用严格模式:
-
非严格模式:
const obj = { name: 'Alice', greet() { console.log(this.name); } }; const fn = obj.greet; fn();输出"Alice"?不——实际输出undefined或全局变量值(如window.name),因为 this 指向window,而window.name可能为空或已被赋值。 -
严格模式:
同样代码加
"use strict";,fn()中的 this 是undefined,访问this.name会直接报错:TypeError: Cannot read property 'name' of undefined。
回调函数传参时的表现差异
把方法当作参数传入另一个函数(如 setTimeout、事件监听器、工具函数)时,也属于隐式绑定丢失:
- 非严格模式下:
setTimeout(obj.greet, 100);中 this 指向window,可能意外读取或修改全局属性; - 严格模式下:this 为
undefined,错误更早暴露,避免静默失败或污染全局。
显式绑定中 null/undefined 的处理
使用 call、apply 或 bind 传入 null 或 undefined 作为 thisArg 时:
立即学习“Java免费学习笔记(深入)”;
- 非严格模式:自动把
null/undefined替换为全局对象; - 严格模式:原样使用
null/undefined,this 就是真的null或undefined,不会兜底。
ES 模块环境默认行为
所有 .mjs 文件或 <script type="module"> 脚本天然处于严格模式,因此其中的普通函数调用、方法提取调用、回调执行等场景,this 均为 undefined,不存在全局对象回退机制。开发者无需手动写 "use strict",但必须意识到这种默认行为。


















