javascript 中的 this 绑定由函数被调用时的执行上下文决定,进入上下文时即确定且不可变;全局上下文中 this 指向 window(浏览器)或 module.exports(node),严格模式不改变该值;函数上下文中 this 依调用方式分默认、隐式、显式和 new 四种绑定规则;箭头函数无自有 this,定义时继承外层普通函数或全局的 this,且不可被 call/apply/bind 修改。

JavaScript 中的 this 绑定不是独立存在的,它由函数**被调用时所处的执行上下文**决定。执行上下文(Execution Context)是 JS 运行时的环境容器,包含变量环境、词法环境和 this 绑定三部分。其中 this 的值在进入执行上下文时就已确定,且在整个上下文生命周期内固定不变——它不随函数内部代码变化,只取决于“谁调用它”以及“怎么调用”。
全局执行上下文中的 this
脚本启动时创建全局执行上下文。在浏览器中,全局 this 指向 window;在 Node.js 中指向 module.exports(即 globalThis)。严格模式下,全局上下文的 this 仍为全局对象(不是 undefined),这点常被误解。
- 非严格模式:
this在全局作用域中就是window(浏览器)或global(Node) - 严格模式不影响全局上下文的
this值,只影响函数上下文
函数执行上下文中的 this 绑定规则
函数被调用时会创建新的执行上下文,this 值依据调用方式在“进入上下文”阶段绑定,共四种主要情况:
-
默认绑定:独立调用(如
foo()),非严格模式下this是全局对象,严格模式下为undefined -
隐式绑定:通过对象属性调用(如
obj.method()),this指向点号前的对象(obj) -
显式绑定:使用
call/apply/bind,直接指定this值,bind还会生成新函数并固化该绑定 -
new 绑定:用
new调用函数时,this指向新创建的实例对象,且优先级高于显式绑定
箭头函数没有自己的 this
箭头函数不创建执行上下文的 this 绑定,它从外层普通函数(或全局)作用域“继承” this 值。这个继承发生在**定义时**,而非调用时,因此不受调用方式影响。
- 箭头函数内部的
this实际是外层最近一层普通函数上下文的this值 - 若外层没有函数上下文(比如直接写在全局),则继承全局上下文的
this - 无法用
call/apply/bind改变箭头函数的this
执行上下文栈与 this 的动态性
每次函数调用都压入执行上下文栈,每个上下文有自己独立的 this 值。嵌套调用时,内层函数的 this 不受外层影响——除非使用箭头函数或显式绑定传递。
- 回调函数(如
setTimeout或事件处理器)通常触发默认绑定,this容易丢失 - 常见修复方式:用箭头函数、
bind(this)、或在调用前保存const self = this - 类方法作为事件监听器时,需注意是否被解构或单独引用,否则隐式绑定失效
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











