位置: 编程技术 - 正文

JavaScript的this关键字的理解(js里的this)

编辑:rootadmin

推荐整理分享JavaScript的this关键字的理解(js里的this),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:彻底弄懂js中的this指向,如何理解js中的this,彻底弄懂js中的this指向,如何理解js中的this,javascript中this的用法,js中this的概念,javascript中this的用法,js中的this关键字,内容如对您有帮助,希望把文章链接给更多的朋友!

概念性的概述this

当一个函数创建后,一个关键字this就随之(在后台)创建,它链接到一个对象,而函数正是在这个对象中进行操作。换句话说,关键字this可在函数中使用,是对一个对象的引用,而函数正是该对象的属性或方法。

让我们来看这个对象:

注意在函数getGender里,由于在cody对象内部,我们可以通过.来获取gender属性(也就是cody.gender)。也可以用this来获取cody对象,因为this正是指向cody对象。

this.gender中this指向cody对象,而getGender函数可以操作cody对象。

关于this的主题可能有点让人感到困惑,其实不必如此。仅记住,通常,this指向的对象正是包含函数的对象,而不是函数本身(当然也有例外,例如采用关键字new或者call()和apply())。

重要提示

- 关键字this就像其他的变量,唯一不同就是你不能更改它。

- 不同于传给函数的其他参数和变量,在调用函数的对象中,this是一个关键字(而不是属性)。

如何确定this的值?

this传递给所有的函数,它的值取决于函数运行时何时被调用。这里请注意,因为这是你需要记住的一个很特别的地方。

下面的代码中myObject对象有个属性sayFoo,它指向函数sayFoo。当在全局域中调用sayFoo函数时,this指向window对象。当myObject调用函数时,this指向的是myObject。

因为myObject有个叫foo的属性,在这里被使用。

很清楚,this的值取决于函数什么时候被调用。myObject.sayFoo和sayFoo都指向同样的函数,但sayFoo()调用的上下文不同,this的值也就不同。下面是类似的代码,head对象(window)显式使用,希望对你有用。

确保当你有多个引用指向同一个函数的时候,你清楚的知道this的值是随调用函数的上下文的不同而改变。

重要提示

- 除了this以外的所有变量和参数都属于静态变量范围(lexical scope)。

在嵌入函数内this指向head对象

你可能想知道在嵌入在另外一个函数的函数中使用this会发生什么事。不幸的是在ECMA 3中,this不遵循规律,它不指向函数属于的对象,而是指向head对象(浏览器的window对象)。

JavaScript的this关键字的理解(js里的this)

在下面的代码,func2和func3中的this不再指向myObject,而是head对象。

然而在ECMAScript 5中,这个问题将会得到修正。现在,你应该意识到这个问题,尤其是当你将一个函数的值传递到另一个函数时。

看看下面的代码,将一个匿名函数传给foo.func1,当在foo.func1中调用匿名函数(函数嵌套在另一个函数中),匿名函数中this将会指向是head对象。

现在你不会忘了,如果包含this的函数在另一个函数中,或者被另一个函数调用,this的值将会指向的是head对象(再说一次,这将在ECMAScript 5中被修正。)

解决嵌套函数的问题

为了使this的值不丢失,你可以在父函数中使用一个作用域链(scope chain)来保存对this进行引用。下面的代码中,使用一个叫that的变量,利用它的作用域,我们可以更好的保存函数上下文。

控制this的值

this的值通常取决于调用函数的上下文(除非使用关键字new,稍后会为你介绍),但是你可以用apply()或call()指定触发一个函数时this指向的对象,以改变/控制this的值。用这两种方法就好像再说:“嘿,调用X函数,但让Z对象来作this的值。”这样做,JavaScript默认的this的值将被更改。

下面,我们创建了一个对象和一个函数,然后我们通过call()来触发函数,所以函数中的this指向的是myOjbect。在myFunction函数中的this会操作myObject而不是head对象,这样我们就改变了在myFunction中this指向的对象。

在上面的例子,我们用了call(),apply()也可适用于同样用法,二者的不同之处在于参数如何传给函数。用call(),参数用逗号分开,而用apply(),参数放在一个数组中传递。下面是同样的代码,但是用apply()。

在自定义构造函数中用this

当函数用关键字new来触发,this的值?由于在构造函数中声明?指向实例本身。换种说法:在构造函数中,我们可以在对象真正创建之前,就用this来指定对象。这样看来,this值的更改和call()或apply()相似。

下面,我们构造了一个构造函数Person,this指向创建的对象。当Person的对象创建后,this指向这个对象,并将属性name放在对象内,值为传给这个构造函数的参数值(name)。

这样,当用关键字new触发构造函数时,this指向“要创建的对象”。那么如果我们没有用关键字new,this的值将会指向触发Person的上下文——这时是head对象。让我们来看看下面的代码。

在prototype方法内的this指向构造实例

当一个方法作为一个构造函数的prototype属性时,这个方法中的this指向触发方法的实例。这里,我们有一个Person()的构造函数,它需要person的全名(full name),为了获得全名(full name),我们在Person.prototype中加入了一个whatIsMyFullName方法,所有的Person实例都继承该方法。这个方法中的this指向触发这个方法的实例(以及它的属性)。

下面我创建了两个Person对象(cody和lisa),继承的whatIsMyFullName方法包含的this就指向这个实例。

在prototype对象内的方法里使用this,this就指向实例。如果实例不包含属性的话,prototype查找便开始了。

提示

- 如果this指向的对象不包含想要查找的属性,那么这时对于任何属性都适用的法则在这里也适用,也就是,属性会沿着prototype链(prototype chain)上“寻找”。所以在我们的例子中,如果实例中不包含fullName属性,那么fullName就会查找Person.prototype.fullName,然后是Object.prototype.fullName。

查看更多JavaScript的语法,大家可以关注:《JavaScript 参考教程》、《JavaScript代码风格指南》,也希望大家多多支持积木网。

Javascript中prototype的使用详解 先看下面一段代码:functionMachine(ecode,horsepower){this.ecode=ecode;this.horsepower=horsepower;}functionshowme(){alert(this.name+""+this.ecode+""+this.horsepower);}varmachine=newMachine("cod

prototype.js常用函数详解 函数名解释举例Element.toggle交替隐藏或显示Element.toggle(''div1'',''div2'')Element.hide隐藏Element.hide(''div1'',''div2'')Element.show显示Element.show(''div1'',''div2'')Element.remov

Javascript闭包与函数柯里化浅析 闭包和柯里化都是JavaScript经常用到而且比较高级的技巧,所有的函数式编程语言都支持这两个概念,因此,我们想要充分发挥出JavaScript中的函数式编程

标签: js里的this

本文链接地址:https://www.jiuchutong.com/biancheng/370136.html 转载请保留说明!

上一篇:好好了解一下Cookie(强烈推荐)(好好了解 英文)

下一篇:prototype.js常用函数详解(prototype.js中文文档)

  • 固定模板的东西叫什么
  • 建筑企业外管证有效期
  • 上期有留抵进项税额,本期如何转,如何做账
  • 公司承担个人社保部分福利
  • 海关入库成功下一步干嘛
  • 信用减值损失在借方
  • 公司为其他企业提供担保,担保对象可以是公司股东吗
  • 增值税发票的票面金额
  • 外购动力的分录
  • 公司接受投资会计科目
  • 汽车以租代售合法吗
  • 货代行业红字冲正发票怎么做凭证
  • 广告费支出限额
  • 收取职工房租 算收入吗
  • 电子发票能不能作废重开
  • 2021年电子税务局印花税怎么申报
  • 资产处置损益和营业外收支的区别和联系
  • 个人公积金公司这178,个人交多少
  • 政府无偿给企业划拨土地是否需摊销
  • 电子承兑转让怎么撤销
  • 营改增建筑业税率变化时间
  • 企业缴纳社保包含哪些内容
  • 取得成本tc
  • 苹果手机无法加入WiFi
  • mac如何修改照片的尺寸大小
  • 全资子公司给母公司担保
  • php数组函数有哪些
  • linux文件夹怎么删除
  • php面向对象优点,缺点
  • 怎样改善现金流量比率
  • 结构性存款利息增值税
  • 别人从我公司走账怎么做账务处理
  • 学生兼职收入按什么交个税
  • 命令行基础
  • php如何删除数组元素
  • 实收资本账户对应的账户包括
  • 债券利息调整怎样计算
  • 高新补贴收入是否可以作为不征税收入
  • vue页面刷新时原有的数据还在吗
  • YOLOv5|YOLOv7|YOLOv8改各种IoU损失函数:YOLOv8涨点Trick,改进添加SIoU损失函数、EIoU损失函数、GIoU损失函数、α-IoU损失函数
  • php 电子签名
  • 结转销售成本的凭证需要附件吗
  • 装修公司管理费是什么
  • 销售不同商品的会计分录
  • 出纳各种费用如何归类
  • 去年未分配利润为负什么意思
  • 销售使用过的车辆应该如何交增值税
  • 代开运输发票是否会引起双重征税?
  • 专票作废扣税吗
  • SQL Server通过重建方式还原master数据库
  • SQL2008中通过DBCC OPENTRAN和会话查询事务
  • 固定资产减少处理
  • 收据所得税前扣除
  • 金税四期功能
  • 计提工资是计提哪个月的
  • 工程结算编制收费标准
  • 消费税直接计入销售额吗
  • 挂靠公司收的税费计入什么科目?
  • 管理费用如何结转成本
  • 报销招待费是什么意思
  • 资产负债表上应交税费是什么意思
  • 现金日记账需要日清月结吗
  • 主营业务成本与其他业务成本的区别
  • 购方收到红字发票怎么开
  • 行政事业单位经济责任审计的主要内容
  • 苹果发布会最新消息
  • 双系统麻烦吗
  • win10录音机不能用
  • mysql删除key
  • WIN10系统摄像头在哪打开
  • jquery如何获取input的值
  • nodejs实战教程
  • Node.js中的核心模块包括哪些内容?
  • node.js 生成pdf
  • js中的三种弹出消息提醒的命令
  • python字典有什么用
  • JAVAscript字符串类型单引号和双引号意一样吗
  • 如何网上开税票
  • 正外部性与负外部性的定义
  • 福建省国家税务总局稽查局局长
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设