深入浅出——this的理解与使用

news2024/9/27 12:16:48

文章目录

  • this的语法理解
  • 一、this的绑定方式
  • 二、两个细节
    • 1.严格模式引入库
    • 2.如何更改this指向
  • 总结

this的语法理解

this在英文中是一个指示代词,表示  这;这个 

顾名思义,在编程于语言里,this就是一个指代作用。

我在人民广场吃着炸鸡

小明也在人民广场吃着炸鸡

人民广场还有跳广场舞的阿姨

还有三只小猫在人民广场睡觉

这样表达没毛病,但是太过繁琐,如果把重复的人民广场用   这  来代替,就会变成:

我在人民广场吃着炸鸡

小明也在吃着炸鸡

还有跳广场舞的阿姨

还有三只小猫在睡觉

如果在写代码的时候, 太多对象名字重复使用,会使代码看起来繁琐,不简洁,乱等等,我们就可以使用this来解决这个问题。接下来具体看看this究竟有些什么语法,以及怎么用?


一、this的绑定方式

1.默认绑定

			function fn(){
				console.log(this);
			}
			fn()

 

我们可以看到,函数在全局调用的时候,this默认指向window对象

 2.隐式绑定

			var obj ={
				name:'亚索',
				age:'20岁',
				height:'185cm',
				weight:'150斤',
				ziliao:function(){
					console.log('姓名:'+ this.name);
					console.log('年龄:'+ this.age);
					console.log('身高:'+ this.height);
					console.log('体重:'+ obj.weight);
				}
			}
			obj.ziliao()

 

我们通过上面这个例子可以看到,当我们调用一个对象的方法时,就会出现隐式绑定,this会指向对象。如果不用this,也可以把this换成obj,是一样的,只不过this更方便。此时this指向当前对象,翻译为这个名字,这个年龄,这个身高,这个体重。

 3.显式绑定

		var lol = {
			name:'阿卡丽',
			whatName:function(){
				console.log('我最爱的英雄是'+this.name);
			}
		}
		var hero1 ={
			name:'卡特琳娜'
		}
		var hero2 ={
			name:'卢锡安'
		}
		lol.whatName.apply(hero1)
		lol.whatName.apply(hero2)
		lol.whatName.call(hero1)
		lol.whatName.call(hero2)

 

这种方法可以指定this的绑定对象。call()与apply()的效果是完全相同的

 4.构造函数绑定

		function People(name) {
			this.name = name;
			this.favour = function() {
				console.log('我最喜欢的英雄是' + this.name);
			}
		}
		var name = '卡特琳娜'
		var Lovename = new People('阿卡丽')
		Lovename.favour();

 

当我们new一个构造函数,得到的这个实例,它继承了构造器的构造属性以及原型上的属性。

 5.箭头函数绑定

其实箭头函数是没有this的,如果想在箭头函数中用this。那么一定要把箭头函数嵌套在一个作用域内部,箭头函数的this指向取决于外层作用域中的this,外层作用域或函数的this指向谁,箭头函数中的this就指向谁。这有点继承的意思,但更重要的是,箭头函数本身没有this,如果绑定成功,则没有办法修改。

二、两个细节

1.严格模式

严格模式即'use strict'  

严格模式下,规定禁止this关键字指向全局对象window,此时this会绑定到undefined  

    function fn(){
            'use strict'
            console.log(this);
        }
        fn()    //打印结果为undefined      
                // 'use strict'   是一种声明关键词,告诉浏览器,此时是严格模式。  

2.如何更改this指向

一般的,我们常用call(),apply()方法来更改this指向 

首先call(),apply()是函数自带的方法,在调用函数时,可以改变this指向。这一点在显示绑定里,有了详细的说明。

call方法接受的是一个实参列表,第一个实参指向this,其余实参赋给形参进入函数。

语法:

fn.call(this,参数2,参数3,参数4)

apply方法接受的是一个实参列表,第一个实参指向this,其余实参会在一个数组里,以数组为参数的形式赋值给形参进行传参

语法:

fn.apply(this,[参数2,参数3,参数4])

还有一个方法就是bind(),但是意义不大,有兴趣可以去MDN官网查看。


总结

1.this可用可不用,不用代码也能敲,需求也能实现,但用了方便

2.this常见的绑定方式,有默认绑定,隐式绑定,显式绑定,构造函数绑定,箭头函数绑定

3.严格模式下,规定this指向undefined

4.更改this指向的方法,常用call(),apply()

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

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

相关文章

《分布式技术原理与算法解析》学习笔记Day20

CAP理论 什么是CAP理论? CAP理论用来指导分布式系统设计,以保证系统的可用性、数据一致性等。 C,Consistency,一致性,指所有节点在同一时刻的数据是相同的,即更新操作执行结束并响应用户完成后&#xff…

GO 中的 defer 有哪些注意事项?上

xdm , 不知道你们是否有使用过 defer ,这种语法在是 go 特有的,用起来真是爽的不要不要的 很多时候,我们在使用一些新东西,出现一些莫名其妙的现象或者是结果的时候,我们总会认为,这个东西不友…

打游戏什么蓝牙耳机好用?打游戏比较好的蓝牙耳机

游戏耳机提供身临其境的细致声音,同时也是与朋友在线聊天的绝佳通信设备,尤其对于游戏玩家来说,聆听和被聆听的最佳方式之一就是游戏耳机,那2023年到底有哪些值得购买的游戏耳机呢?现在就让我们一起来看看吧。 第一款…

【uniapp】uniapp项目vue2/vue3引入使用vant组件库

前言 vant是一个优秀的移动端组件库,他支持VUE2、VUE3、微信小程序三个框架,这期就来尝试在uniapp中,vue2和vue3分别引入vant组件库 注意:本教程只适用H5,无法运行到微信小程序 Vue3引入vant 新建一个uniapp项目&am…

如何利用 Python 进行客户分群分析(附源码)

每个电子商务数据分析师必须掌握的一项数据聚类技能 如果你是一名在电子商务公司工作的数据分析师,从客户数据中挖掘潜在价值,来提高客户留存率很可能就是你的工作任务之一。 然而,客户数据是巨大的,每个客户的行为都不一样。20…

python中安装gurobi和pycharm没有语法提示问题解决

安装gurobi第一步 :下载gurobi ( http://www.gurobi.com ) ,需要注册账号第二步、申请License注册如果可以通过校园网, 则直接生成。不能的话,通过网站,发邮件申请 http://www.gurobi.cn/NewsView1.Asp?id4第三、邮件…

【虹科】基于Lidar的体积监控实现高效的库存管理

迄今为止,很多物料厂家测量库存的结果数据仍然不准确,会存在很大的误差,导致供应链效率低下——这个问题可以通过Lidar技术轻松解决。近年来,全球供应链的脆弱性已经多次得到证明。无论是油轮被困在苏伊士运河,阻塞海峡…

JSP 在线学习管理系统myeclipse定制开发sqlserver数据库网页模式java编程jdbc

一、源码特点 JSP 在线学习管理系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为SQLServer2008&#x…

从事Python自动化测试,30岁熬到月薪20K+,分享我的多年面试经…

年少不懂面试经,读懂已是测试人。 大家好,我是小码哥,一名历经沧桑,看透互联网行业百态的测试从业者,经过数年的勤学苦练,精钻深研究,终于从初出茅庐的职场新手成长为现在的测试老鸟&#xff0…

nodejs/eggjs如何使用第三方pure esm lib

问题Instead change the require of index.js in xxx/app/ws/index.ts to a dynamic import() which is available in all CommonJS modules.上述错误发生在我使用import引入一个第三方包的时候提示的,至于原因,主要是node当前仅支持cjs,而目…

TCP的三握四挥

本文是向大家介绍tcp的三次握手四次挥手的全过程,能够让我们更熟悉面向连接的传输层控制协议的原理,保证了数据传输的稳定性和可靠性。如果我们把网络体系按照OSI模型划分,那么不论是从上往下还是从下往上数,处于最中间的都是传输…

复赛名单公布!2022隐私计算HACKATHON大赛火热进行中!

开放隐私计算开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神,专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播,愿成为中国 “隐私计算最后一公里的服务区”。183篇原创内容公众号O…

Python+Qt生日提醒

PythonQt生日提醒如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01;前言这篇博客针对<<PythonQt生日提醒>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应用推荐首选。文章目…

在k8s集群部署ELK

使用kubeadm或者其他方式部署一套k8s集群。 在k8s集群创建一个namespace&#xff1a;halashow 2 ELK部署架构 3.1 准备资源配置清单 Deployment中存在一个es的业务容器&#xff0c;和一个init容器&#xff0c;init容器主要是配置vm.max_map_count262144。 service暴露了9200…

MSP430F2132IRHBR功能框图TPS259824LNRGER电路保护和电源管理解决方案芯片

概述&#xff1a;MSP430F21x2 16位超低功耗微控制器 (MCU) 是MSP430系列微控制器的一部分。这些MCU采用一种架构&#xff0c;加上5种低功耗模式&#xff0c;能在便携式测量应用中延长电池的使用寿命。这些器件具有一个强大的16位 RISC CPU、16位寄存器和用于获得最大编码效率的…

Springboot整合mybatis并接收前端数据

mybatis之前记录过了。本以为可以快乐的开发项目&#xff0c;但是没想到在springboot中使用mybatis还不一样&#xff0c;那么我就在这里记录一下。 请注意&#xff0c;sprngboot中使用的mybatis是专门为springboot设计的&#xff0c;单独引用依赖的话需要在springboot找到如下…

Java性能分析

0、问题代码&#xff1a; 代码问题其实很明显&#xff0c;但是这里主要是为了练习如何使用工具进行分析 所以最好先不要看代码&#xff0c;假装不知道程序逻辑&#xff0c;而是先通过工具去分析&#xff0c;再结合分析数据去看代码&#xff0c;从而推出问题点在哪 import jav…

代码随想录NO50 |动态规划_leetcode 392.判断子序列 115.不同的子序列

动态规划_leetcode 392.判断子序列 115.不同的子序列今天继续子序列&#xff01; 392.判断子序列 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j] 表示以下标i-1为结尾的字符串s&#xff0c;和以下标j-1为结尾的字符串t&#xff0c;相同子序列的长度为dp…

靠谱的动漫绘画培训班国内有哪些

动漫绘画培训班有哪些&#xff0c;今天给大家带来的是国内专业的动漫培训机构排名&#xff0c;这5个动漫培训机构&#xff0c;相信你一定都知道&#xff0c;快来看看吧&#xff01; 一&#xff1a;动漫绘画培训机构排名 1、轻微课 轻微课是国内人气很高的板绘学习平台&#…

2.23作业ccc

检测中断到来时&#xff0c;让LED灯状态取反&#xff0c;并且在串口工具上打印一句话例如&#xff1a;当按键1按下之后&#xff0c;让LED1状态取反&#xff0c;并打印“LED1 down”当按键2按下之后&#xff0c;让LED2状态取反&#xff0c;并打印“LED2 down”当按键3按下之后&a…