You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue中调用方法时括号对this指向的影响及疑问

为什么Vue事件绑定中带括号与不带括号的this指向不同?

先看你的代码场景:

const me = reactive({
  name: "foo",
  sayHi: function () {
    console.log("Hi I am : ", this);
  },
});

模板里的两种绑定方式:

  • <Comp :name="me.name" @sayHi="me.sayHi"/>
  • <Comp :name="me.name" @sayHi="me.sayHi()"/>

第一种情况(不带括号):this为undefined的原因

当你直接传递me.sayHi时,本质是把这个函数的引用单独抽出来传给事件处理器。由于me是reactive创建的代理对象,取出me.sayHi时,这个函数已经和原代理对象的上下文脱钩了。Vue触发事件时会直接调用这个函数,此时函数是以普通函数形式执行的(没有通过对象.方法()的调用方式),在严格模式下普通函数的this就是undefined。

第二种情况(带括号):this指向me的原因

写me.sayHi()时,模板会把它解析成一个匿名函数,大致等价于:

@sayHi="() => { me.sayHi() }"

事件触发时执行的是这个匿名函数,里面通过me.sayHi()的形式调用方法——这里的me是响应式代理对象,通过.调用方法时,函数的this会自动绑定到me这个代理对象上,所以打印的this就是预期的对象本身。

补充:让不带括号的写法也能绑定正确的this

如果想保留不带括号的写法,同时让this指向me,可以用这两种方式:

// 方式1:用箭头函数(直接引用me代替this)
const me = reactive({
  name: "foo",
  sayHi: () => {
    console.log("Hi I am : ", me);
  },
});

// 方式2:手动绑定this到me
const me = reactive({
  name: "foo",
  sayHi: function () {
    console.log("Hi I am : ", this);
  },
});
me.sayHi = me.sayHi.bind(me);

内容的提问来源于stack exchange,提问作者walox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 04:28:09