全局上下文和普通函数中this指向取决于严格模式及调用方式:非严格模式下全局this为window或global,严格模式或esm中为undefined;普通函数直接调用时,非严格模式this为全局对象,严格模式为undefined。

全局上下文和普通函数中的 this 指向,核心只看「是否在严格模式下」以及「函数怎么被调用」,不看它写在哪、定义成什么样。
全局上下文中的 this
在脚本最外层(不在任何函数内),this 的值由环境和模式共同决定:
- 浏览器中非严格模式:指向 window
- Node.js 中非严格模式:指向 global
- ES 模块(.mjs)或启用
"use strict"的全局代码:指向 undefined
注意:ESM 模块默认就是严格模式,所以顶层 this 总是 undefined,不是 window。
普通函数直接调用时的 this
当一个函数被「单独调用」,没有点号(.)、没有 new、没有 call/apply/bind,比如 fn() 或 (function(){})(),它的 this 就取决于是否严格模式:
- 非严格模式:指向全局对象(
window或global) - 严格模式:明确为 undefined
例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function checkThis() { console.log(this); }
checkThis(); // 非严格 → window;严格 → undefined
容易出错的典型场景
看似“在对象里”,但实际是普通调用,this 就会意外丢失:
-
const fn = obj.method; fn();→ this 不再是obj,而是全局或 undefined -
setTimeout(obj.method, 100)→ 同样失去绑定,this 回到调用环境 - 解构赋值后调用:
const { method } = obj; method();→ 效果等同于上两条
这类问题的本质是:调用时没了「点号左边的对象」,就退化为普通函数调用。
如何验证当前 this 是什么
最直接的方式是在函数内部加一行调试语句:
function test() {
console.log('this === window:', this === window);
console.log('this === undefined:', this === undefined);
console.log('this:', this);
}
配合浏览器开发者工具的「Console」或断点调试,能立刻确认实际值。不需要猜,运行一次就清楚。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










