默认绑定下,非严格模式this指向全局对象(如window),严格模式为undefined;仅适用于直接调用(如fn())、无点号、new、call/apply/bind等干预的场景。

默认绑定是 this 最基础的规则,关键就看函数是不是“光溜溜地调用”——既没点号(obj.fn())、没 call/apply/bind、也没 new,就是直接写 fn() 或类似形式。这种情况下,严格模式和非严格模式的表现截然不同。
非严格模式下 this 指向全局对象
浏览器里就是 window,Node.js 里是 globalThis。这意味着你在全局声明的变量,能通过 this 访问到:
var name = "Alice"; function say() { console.log(this.name); } say(); // 输出 "Alice"- 因为
this === window成立,this.name实际读的是window.name - 这种隐式挂载容易引发意外修改,比如误改
this.location导致页面跳转
严格模式下 this 是 undefined
只要函数体顶部有 'use strict';,或整个脚本/模块处于严格上下文(如 ES6 模块默认严格),fn() 调用时 this 就是 undefined:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
'use strict'; function check() { console.log(this); } check(); // undefined- 此时访问
this.xxx会立即报错:Cannot read property 'xxx' of undefined - ES6 模块(
.mjs文件或含import/export的脚本)自动启用严格模式,这点容易被忽略
怎么快速判断当前属于哪种默认绑定
不靠猜,靠验证:
立即学习“Java免费学习笔记(深入)”;
- 在函数开头加
console.log(this === undefined);—— 输出true就是严格模式默认绑定 - 或者
console.log(this === globalThis);—— 非严格模式下为true - 检查是否有
'use strict';声明,或是否在模块环境中运行(import存在即默认严格)
常见误判场景:赋值后再调用仍是默认绑定
很多人以为“从对象上取出来的函数还带着 this”,其实不是:
const obj = { x: 10, fn() { console.log(this.x); } }; const f = obj.fn; f();- 这里
f是纯函数引用,f()属于独立调用,触发默认绑定,不是隐式绑定 - 非严格模式下输出
undefined(因为window.x不存在),严格模式直接报错

















