vue中自定义方法this指向问题

本文详细解释了Vue中自定义方法内部this的指向规律:在普通函数中this指向Vue实例,在不受Vue管理的函数中推荐使用箭头函数来确保this指向正确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义方法(普通函数)内部的this指向vue实例(vm)。

不建议用箭头函数,因为箭头函数this本身没有指向,会去外边找,找到的this是window对象,而不是vue实例。

不被vue所管理的函数(定时器回调,ajax回调,Promise回调),最好写成箭头函数,这样this指向才是vm或组件实例对象。

### Vue2 中 `this` 关键字的指向规则 #### 函数调用中的 `this` 在 JavaScript 的普通函数中,当函数被直接调用时,在非严格模式下 `this` 指向全局对象(通常是浏览器环境下的 `window` 对象),而在严格模式下 `this` 是 `undefined`[^2]。 ```javascript function testThis() { "use strict"; return this; } console.log(testThis()); // 输出: undefined ``` 然而,在 Vue 组件的方法、生命周期钩子和其他特定上下文中,`this` 始终指向当前组件实例。这是因为 Vue.js 明确绑定了这些方法内的 `this` 到对应的 Vue 实例上。 #### 方法和生命周期钩子里的 `this` 对于像 `created()` 或者其他自定义方法来说,只要它们是在 Vue 组件选项内声明的,则其中使用的 `this` 将自动绑定到该组件实例: ```typescript export default class GoodsClassify extends Vue { private created() { console.log(this); // 正常情况下会打印出 VueComponent 实例 } } ``` 但是需要注意的是,如果尝试通过 HTML 属性事件处理器来触发某个方法的话,可能会遇到 `this` 变成 `null` 或者未预期的对象的情况。这通常发生在使用箭头函数作为回调的情况下,因为箭头函数不会创建自己的 `this`,而是继承外部作用域的 `this` 值[^1]。 为了确保正确的 `this` 指向,可以采用如下几种解决方案之一: - 使用 `.bind(this)` 来显式地设置 `checkChange` 方法里的 `this`; - 改写为类成员表达式的箭头函数形式; ```typescript // 方案一:使用 bind private treeOptions = { data: [], defaultProps: { children: 'children', label: 'name' }, checkChange: function () { console.log(this); }.bind(this), }; // 方案二:改写为箭头函数 private treeOptions = { data: [], defaultProps: { children: 'children', label: 'name' }, checkChange: () => { console.log(this); }, }; ``` 另外值得注意的一点是,在模板语法中使用过滤器时,如 `{{ item.name | demoFn }}` ,这里的 `demoFn` 并不是作为一个独立函数执行,而是一个特殊的处理过程的一部分,因此其内部的 `this` 不会被影响,并且应该按照正常的 Vue 组件逻辑工作[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值