关于vue的this指向问题

思否 问答 👍 4 含 AI 优化版

问题

关于vue的this指向问题

在 SegmentFault 查看原问题 →

由大模型辅助整理,保留原意,优化结构与可读性。

问题概述

提问者在 Vue 项目中遇到了 this 指向的疑问:为什么在某些函数内部访问的 this 与预期不一致,涉及函数作用域下 this 的绑定规则。

涉及技术

JavaScript、Vue、this 绑定

期望结果

希望系统性理解 this 在普通函数、箭头函数、严格模式等不同场景下的指向规则,以及如何通过 bind 等方式修正 this 指向。

回答

原始回答

2019-10-18

function的作用域呗

想改变可以用bind。也可以用箭头函数=>

更新时间 2019年10月18日14:43:55

我看这个问题还在一直回复,我再来完善一下我的答案

我们来思考一个问题,this指向谁?

全局状态下

function中

function中、并赋值给某个对象

function中、并赋值给某个对象,之后赋值给另外一个对象并调用

上面只是常规状态,那么严格模式下呢?

留下一道相似的题,当this改变的时候,a也会切换到this的环境中吗?为什么?

先来写一下结论吧。通常this会指向调用他的对象,如果没有会指向windows,如果严格模式下指向undefined。结合这个规则回去看看上面的问题吧。

AI 优化 · 回答整理

解答思路

this 指向的本质是「函数的作用域规则」:普通函数中的 this 由调用方式决定,若指向出现偏差,可以用 bind 显式绑定,或直接改用箭头函数,因为箭头函数不会创建自己的 this,而是继承定义时所在作用域的 this

详细说明

按常见场景梳理 this 的指向规律:

  • 全局环境下:非严格模式中 this 指向 window(浏览器环境),严格模式下为 undefined
  • 普通 function 内部this 由调用方式决定,直接调用时指向全局对象(非严格模式)或 undefined(严格模式)。
  • function 作为某个对象的方法调用this 指向调用该方法的对象,例如 obj.fn()this 指向 obj
  • 方法被赋值给其他对象后再调用this 会指向新的调用者,而不是原来定义时所在的对象,这也是很多「this 丢失」问题的根源。

概括结论:this 通常指向调用它的对象;如果没有明确的调用者,则指向 window(非严格模式)或 undefined(严格模式)。这也是 Vue 组件方法中经常需要用箭头函数或 bind 来保证 this 正确指向组件实例的原因——因为普通函数在被作为回调(如 setTimeout、事件监听)传递时,调用者往往不再是组件实例本身。

小结

this 的指向取决于函数被「如何调用」,不是「在哪里定义」。理解「调用者决定 this」和箭头函数「继承外层 this」这两条规则,就能解释绝大多数 Vue 组件中的 this 指向问题;改变指向可以用 bind/call/apply 或箭头函数。

由大模型辅助整理,保留原意,补充结构与代码格式。

回答转载自 SegmentFault

评论

评论功能即将开放。你也可以通过 邮件GitHub Issue 反馈。