Vue组件导出与未导出方法差异及未导出方法访问this问题咨询
你的初始理解完全正确!
先给你敲板确认核心结论:
export default的methods中定义的fooExported()属于组件实例的公共方法,不仅能在模板里直接调用,还能通过组件实例的this访问;- 直接写在
<script>标签顶层的foo()是该脚本作用域内的私有函数,组件模板、组件实例都无法访问它,只能在这个<script>的顶层代码或者其他同作用域的函数里调用。
接下来聊聊二者的核心差异:
this指向天差地别:这是最关键的区别。Vue会自动把methods里的方法绑定到组件实例,所以方法里的this稳定指向当前组件实例,能直接访问this.$data、this.$props、this.$router等所有组件实例属性;而你定义的foo()是普通函数,在ES模块的严格模式下(Vue组件默认是严格模式),它的this就是undefined——这也是你调用this.$data时报错的原因。- 可访问范围不同:
methods里的方法是组件实例的公开API,你可以在组件的生命周期钩子、其他方法里通过this.fooExported()调用,甚至父组件能通过ref拿到子组件实例后调用它;而foo()的作用域仅限于当前<script>标签的顶层,出了这个脚本就找不到它,组件实例也拿不到。 - 和组件生命周期的绑定关系:
methods里的方法依赖组件实例存在,只有当组件实例创建后才能通过this调用;而foo()只要当前<script>加载完成就能执行,和组件是否挂载、是否销毁完全无关。 - 响应式数据的访问方式:
methods里的方法因为绑定了组件实例,直接访问this.xxx就能拿到响应式数据的最新值;而foo()如果要访问响应式数据,必须手动把组件实例或者具体数据作为参数传进去,它本身和组件的响应式系统没有关联。
关于你遇到的foo()里this.$data为undefined的问题,如果你确实需要在这个私有函数里访问组件数据,可以这么做:
<template> <!-- 模板内容 --> </template> <script> function foo(vm) { // 通过传入的组件实例vm访问数据 console.log(vm.$data.message); } const bar = 123 export default { data(){ return { message: 'MyMessage' } }, methods: { fooExported(){ // ... } }, mounted() { // 把组件实例this传给foo foo(this); } } </script>
简单说就是把组件实例作为参数传递给foo(),这样就能通过参数访问组件的所有实例属性了。
内容的提问来源于stack exchange,提问作者LazNiko
相关产品推荐
相关产品推荐

