vue小记——this

原生和Vue中使用this的这几个坑你都知道吗? - 掘金 (juejin.cn)

在JavaScript中,this是一个特殊的关键字,它在函数被调用时自动定义。this的值在函数被调用时决定,取决于调用的上下文(context),它代表了函数运行时的当前对象。

让我们来看几种不同的情况下this的指向:

全局上下文:在全局作用域中,this指向全局对象。在浏览器环境中,全局对象是window

console.log(this); // window 对象

对象方法:当一个函数作为某个对象的方法被调用时,this指向调用该方法的对象。

const obj = {  prop: 'Hello',  method: function() {  console.log(this.prop); // 输出 'Hello'  }  
};  obj.method(); // 调用 obj 的 method 方法,此时 this 指向 obj

单独调用:如果函数是单独调用的(不是作为对象的方法,也不是通过new关键字),那么this通常指向全局对象(在浏览器中是window)。

function testFunc() {  console.log(this); // window 对象  
}  testFunc(); // 单独调用函数

构造函数:当函数通过new关键字被调用时,它作为一个构造函数,此时this指向新创建的对象实例。

function Person(name) {  this.name = name;  
}  const john = new Person('John'); // 创建一个新的 Person 实例,this 指向 john  
console.log(john.name); // 输出 'John'

事件监听器:在事件监听器内部,this通常指向触发事件的元素。

const button = document.getElementById('myButton');  
button.addEventListener('click', function() {  console.log(this); // 指向 button 元素  
});

箭头函数:箭头函数不绑定自己的this,它继承自包围它的函数或全局作用域的this

function OuterFunction() {  this.value = 'outside';  const innerFunc = () => {  console.log(this.value); // 输出 'outside',而不是 'inside'  };  this.innerFunc = innerFunc;  
}  const outer = new OuterFunction();  
outer.innerFunc(); // 调用箭头函数,this 继承自 OuterFunction 的上下文

Vue 实例中的 this

当你在 Vue 实例的方法中使用 this 时,它指向的是该 Vue 实例。这允许你访问 Vue 实例的 datamethodscomputed 等属性。

new Vue({  el: '#app',  data: {  message: 'Hello Vue!'  },  methods: {  showMessage: function() {  console.log(this.message); // 这里的 this 指向 Vue 实例  }  },  created: function() {  this.showMessage(); // 调用实例方法  }  
});

Vue 组件中的 this

在 Vue 组件中,this 同样指向组件实例。你可以在组件的 methodscomputedwatchmounted 等选项中使用 this

Vue.component('my-component', {  data: function() {  return {  localMessage: 'Hello from component!'  };  },  methods: {  showLocalMessage: function() {  console.log(this.localMessage); // 这里的 this 指向组件实例  }  },  mounted: function() {  this.showLocalMessage(); // 调用组件方法  }  
});

箭头函数中的 this

在 Vue 中使用箭头函数时,this 的行为会有所不同。箭头函数不会创建它自己的 this 上下文,因此 this 在箭头函数中指向的是定义时所在的上下文。如果你在 Vue 的方法中使用了箭头函数,那么 this 将不会指向 Vue 实例,而是指向定义该箭头函数时的上下文。

new Vue({  el: '#app',  data: {  message: 'Hello Vue!'  },  methods: {  showMessage: () => {  console.log(this.message); // 这里的 this 不指向 Vue 实例,而是指向定义时的上下文,可能会导致错误  }  },  created: function() {  this.showMessage(); // 调用实例方法  }  
});

在上面的例子中,showMessage 方法是一个箭头函数,因此 this 在 showMessage 中不会指向 Vue 实例。这通常不是 Vue 中推荐的做法,因为它可能导致混淆和难以调试的错误。


在 Vue 实例的方法中定义一个普通函数时,这个函数的 this 上下文确实会被绑定到 Vue 实例上。这是因为 Vue 在创建实例时会自动绑定方法中的 this。所以,在 Vue 的方法中使用普通函数时,this 会指向 Vue 实例,而不是全局对象(在浏览器中是 window)。

new Vue({  el: '#app',  data: function() {  return {  message: 'Hello Vue!'  };  },  methods: {  showMessage: function() {  console.log(this.message); // 这里的 this 指向 Vue 实例  }  },  created: function() {  setTimeout(this.showMessage, 1000); // 这里的 this 仍然指向 Vue 实例  }  
});

在这个例子中,即使 showMessage 方法是作为 setTimeout 的回调函数传递的,this 仍然指向 Vue 实例,因为 Vue 在创建实例时已经确保了方法的 this 上下文。

然而,如果您在 Vue 实例的方法之外定义了一个函数,并且这个函数被用作回调函数或其他情况,那么您需要确保 this 的正确上下文。在这种情况下,您可以使用箭头函数来捕获 Vue 实例的 this 上下文,因为箭头函数不会创建自己的 this 上下文。

例如:

new Vue({  el: '#app',  data: function() {  return {  message: 'Hello Vue!'  };  },  methods: {  startTimer: function() {  let vm = this; // 保存 Vue 实例的引用  setInterval(() => { // 使用箭头函数  console.log(vm.message); // 通过保存的引用来访问 message  }, 1000);  }  },  created: function() {  this.startTimer();  }  
});

在这个例子中,我们使用了一个箭头函数作为 setInterval 的回调函数。由于箭头函数不绑定自己的 this,它会继承包围它的函数的 this 上下文,即 Vue 实例。因此,我们不需要在 startTimer 方法中创建一个额外的变量来保存 this 的引用,可以直接通过 this.message 来访问数据属性。

总结来说,在 Vue 实例的方法中直接使用普通函数时,this 会正确指向 Vue 实例。但是,当您需要将函数作为回调函数或其他情况使用时,可能需要使用箭头函数来确保 this 的正确上下文。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/691213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Eclipse - Text Editors (文本编辑器)

Eclipse - Text Editors [文本编辑器] References Window -> Preferences -> General -> Editors -> Text Editors Displayed tab witdth: 4 勾选 Insert spaces for tabs 勾选 Show line number References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.n…

力扣(LeetCode)数据结构练习题(2)

今天又写了两道关于链表的练习题,来给大家分享一下。巩固一下上一篇学到的链表知识,题目可以然我们更清楚的认识链表。 目录 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表 给你单链表的头结点 head ,请…

ADO.NET事务处理

在ADO.NET中,事务是一组一起执行的数据库操作,这些操作要么全部成功,要么全部失败。这确保了数据库的一致性和完整性。ADO.NET提供了SqlTransaction类来支持事务处理。 以下是一个使用C#和ADO.NET进行事务处理的示例: csharp代码…

小红书数据分析:sora爆火,为内容行业带来哪些变化

导语 春节还没过完,科技圈就出“大事”了~据悉,OpenAI发布了Sora,一种由文字生成视频的AI工具,且效果极其逼真,打破了多项纪录。Sora的出现,又让人类里通用人工智能AGI近了一步。那么。Sora的出现对于小红…

外贸人做外贸听话要听音

有人说,在做外贸的时候大部分的人都是充当着客服的角色,而且遵循的模式也是一问一答,凡是客户提出的问题,我们都会尽可能详细的回答。 但是对于如何提问客户,却是不知道怎么下手, 于是,在这样的…

从零开始手写mmo游戏从框架到爆炸(十七)— 完善后端报错与客户端显示

导航:从零开始手写mmo游戏从框架到爆炸(零)—— 导航-CSDN博客 我们在前后端交互的请求体的父类中再增加三个字段,分别是失败跳转topic,失败跳转tag,失败原因。 eternity-common - RequestBase.java pac…

hive load data未正确读取到日期

1.源数据CSV文件日期字段值: 2.hive DDL语句: CREATE EXTERNAL TABLE test.textfile_table1(id int COMMENT ????, name string COMMENT ??, gender string COMMENT ??, birthday date COMMENT ????,.......) ROW FORMAT SERDE org.apache.…

wordpress企业网站模板免费

绿色风格的wordpress免费模板,经测试可以免费下载的WP模板。 https://www.wpniu.com/themes/300.html 简洁大气的文化艺术类wordpress模板,可以免费下载,实用易上手,新手也适合。 https://www.wpniu.com/themes/304.html 高端大…

Spring Security对接OIDC(OAuth2)外部认证

前后端分离项目对接OIDC(OAuth2)外部认证,认证服务器可以使用Keycloak。 后端已有用户管理和权限管理,需要外部认证服务器的用户名和业务系统的用户名一致才可以登录。 后台基于Spring Boot 2.7 Spring Security 流程: 前台浏览器跳转到…

C++面试宝典第30题:分发饼干

题目 假设你是一位非常棒的家长,想要给你的孩子们分发一些小饼干。但是,每个孩子最多只能给一块饼干。对每一个孩子i,都有一个胃口值gi,这是能让孩子们满足胃口的饼干的最小尺寸。对每一块饼干j,都有一个尺寸sj。如果sj >= gi,我们就可以将这个饼干j分配给孩子i,这个…

golangci-lint如何关闭typecheck

https://github.com/golangci/golangci-lint/issues/2912 typecheck是go源码的校验,无法通过.golangci.yml配置关闭 可以直接在golangci-lint源码层面关闭typecheck

Springboot AOP开发

Springboot AOP开发 一 AOP概述 AOP,即面向切面编程,简言之,面向方法编程。 针对方法,在方法的执行前或执行后使用,用于增强方法,或拓展。 二 AOP开发 1.引入 spring-boot-starter-aop 在SpringBoot项…

AWS Elastic Beanstalk通过应用负载均衡配置https

接上一篇,今天说说怎么通过AWS Elastic Beanstalk提供的应用负载均衡配置https。 首先创建应用和环境,这里应用可以使用上一篇文章中使用的demo应用(只需要package.json和app.js文件) 创建环境的时候,确认下面两个参…

【高效开发工具系列】PyCharm使用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

自养号测评低成本高效率推广,安全可控

测评的作用在于让用户更真实、清晰、快捷地了解产品以及产品的使用方法和体验。通过买家对产品的测评,也可以帮助厂商和卖家优化产品缺陷,提高用户的使用体验。这进而帮助他们获得更好的销量,并更深入地了解市场需求。因此,测评在…

基于单片机的智能宠物喂食器设计

摘要:阐述智能宠物喂食器的实现方式,以STC89C52单片机为核心芯片,控制LCD的显示、语音芯片的启动和步进电机的运行。通过按键设置预设时间,当时间到达预设时间时,语音电路发出提示,步进电机工作,提供食物。此系统解决了主人由于各种原因不在家,使得宠物不能按时吃饭的问…

ACL 2024系统

文章目录 ACL官方网站信息通知ACL2024 官方模版 ACL官方网站信息通知 https://2024.aclweb.org/ ACL2024 官方模版 https://github.com/acl-org/acl-style-files

【Java中23种设计模式-单例模式2--懒汉式线程不安全】

加油,新时代打工人! 今天,重新回顾一下设计模式,我们一起变强,变秃。哈哈。 23种设计模式定义介绍 Java中23种设计模式-单例模式 package mode;/*** author wenhao* date 2024/02/19 09:16* description 单例模式--懒…

.NET高级面试指南专题九【 泛型概念,常用泛型类和方法,泛型约束,协变与逆变】

C#中的泛型(Generics)是一种强大的编程特性,它允许你在编写代码时使用不特定数据类型,而在编译时确定这些数据类型。泛型使得代码更加灵活、可重用,并提高了类型安全性。 功能和原理 泛型允许你编写能够与不同数据类型…

数字孪生核心技术揭秘(五):BIM究竟是解药还是毒药?

一、关于BIM的那些幻想 1.1 BIM是“数字孪生城市”最后一块拼图? 近几年,CIM概念越来越流行,已经成为数字孪生城市的主流数据模型。CIM原始概念指的是“城市信息模型”;2015年同济大学吴志强院士基于CIM概念提出“城市智慧模型”&…