javascript中this值由执行上下文决定:全局上下文指向window或globalthis,函数上下文取决于调用方式(如obj.fn()的this为obj,独立调用在严格模式下为undefined),eval上下文继承调用者this。

JavaScript 中的 this 值由它所在的执行上下文决定,而执行上下文分三种:全局上下文、函数上下文、Eval 上下文。它们的 this 行为有明确差异,关键在于“谁在调用”和“是否严格模式”。
全局上下文中的 this 指向 window(非严格模式)或 globalThis(严格模式)
代码不在任何函数内时,就处于全局上下文。此时 this 始终绑定到全局对象:
- 浏览器中是
window对象,this === window返回true - Node.js 中是
global对象,现代环境推荐用globalThis统一访问 - 严格模式下,全局上下文的 this 仍是
window或globalThis,不会变成undefined(注意:只有函数中非绑定调用在严格模式下才让 this 为undefined)
函数上下文中的 this 取决于调用方式,不是函数定义位置
函数被调用时才会创建函数上下文,this 不由函数怎么写决定,而由怎么调用决定:
-
对象方法调用:如
obj.fn(),this 指向obj -
独立函数调用:如
fn(),非严格模式下指向window,严格模式下为undefined - call/apply/bind 显式绑定:第一个参数直接指定 this 值
- 箭头函数:不绑定自己的 this,而是继承外层函数上下文的 this
- new 调用构造函数:this 指向新创建的实例对象
Eval 上下文中的 this 继承调用者的 this,但极少使用且不推荐
eval() 执行字符串代码时会创建 Eval 上下文,它的 this 默认与当前执行上下文一致:
- 在全局中
eval("console.log(this)")→ this 是window - 在函数内调用
eval,且该函数 this 是obj,则 eval 内部 this 也是obj - 严格模式下,eval 内部无法修改外层变量环境,this 仍继承调用者,但作用域更受限
- 实际开发中应避免使用
eval,它带来安全风险和性能开销,ECMAScript 规范也明确不鼓励
区分三者的核心逻辑很简单:先看代码在哪种环境里运行,再看该环境如何启动;全局和 Eval 的 this 相对固定,函数的 this 最灵活也最容易出错——它只认“谁调用了我”,不认“我在哪定义”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











