JavaScript中this是运行时绑定的,由调用方式决定而非定义位置;箭头函数例外,采用词法绑定,继承外层作用域this。

JavaScript 中的 this 不是写在代码里就固定不变的,它没有“属于谁”的静态身份,而是在函数真正被调用的那一瞬间,由**谁调用了它、怎么调用的**来决定的。换句话说,this 是运行时绑定的上下文对象,不是定义时绑定的。
函数没执行时,this 是未定的
你声明一个函数,哪怕它写在某个对象内部,只要还没调用,它的 this 就没有任何实际指向。它就像一张空座位表,只有人坐上去(函数被调用),才能知道谁坐在哪儿。
- const obj = { name: 'Alice', say: function() { console.log(this.name); } }; —— 这里 say 函数还没执行,this 没有值
- obj.say(); —— 调用发生,引擎立刻把 obj 绑定给 this,所以输出 Alice
- const fn = obj.say; fn(); —— 同一个函数,但调用方式变了:不再是 obj 在调,而是独立调用,this 就变成 window(非严格模式)或 undefined(严格模式)
调用方式决定 this,不是函数位置决定
很多人误以为“函数写在哪个对象里,this 就指向哪个对象”。这是错的。关键不是“它在哪”,而是“谁在喊它”。就像快递员不会因为包裹贴着某栋楼的门牌就默认送进那户——他看的是收件人签名栏填了谁的名字。
将后端 Java 接口文档转换为前端 TypeScript 类型定义(interface / type)。输入:飞书文档、Spring Boot 接口文档、Swagger/OpenAPI、手写 API 文档等。输出:包含请求参数与响应结果的 .md 文件,含完整 JSDoc 注释。触发关键词:Java 转 TS、接口转换、生成前端类型、接口文档转 TypeScript、DTO/VO/BO 转 interface、后端文档转前端类型、生成接口类型、类型定义生成。
- obj.say() → this 是 obj(隐式绑定)
- say.call(otherObj) → this 是 otherObj(显式绑定)
- new say() → this 是新创建的实例(new 绑定)
- say() → this 是全局对象或 undefined(默认绑定)
箭头函数是个例外:它不绑定自己的 this
箭头函数没有自己的 this 绑定逻辑。它不参与上面四条规则,而是直接沿用定义时所在作用域的 this 值——也就是“词法绑定”。这使它在回调、定时器、事件处理中天然避免 this 丢失问题。
- const obj = { name: 'Bob', run: () => console.log(this.name) }; —— 箭头函数里的 this 取决于它定义时外层作用域的 this,跟 obj 无关
- const obj = { name: 'Bob', run: function() { setTimeout(() => console.log(this.name), 100); } }; —— 内部箭头函数的 this 和外层 run 方法一致,仍指向 obj
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










