位置: 编程技术 - 正文

Javascript中神奇的this(javascript gui)

编辑:rootadmin

推荐整理分享Javascript中神奇的this(javascript gui),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:javascriptj,javascriptjs,javascriptide,javascript definitive guide,javascriptj,javascriptjs,javascriptjs,javascriptz,内容如对您有帮助,希望把文章链接给更多的朋友!

Javascript 当中的 this 与其他语言是完全不同的机制,很有可能会让一些编写其他语言的工程师迷惑。

1. 误以为 this 指向函数自身

根据 this 的英语语法,很容易将函数中出现的 this 理解为函数自身。在 javascript 当中函数作为一等公民,确实可以在调用的时候将属性值存储起来。但是如果使用方法不对,就会发生与实际预期不一致的情况。具体情况,请看下面代码

如果 fn 函数里面的 this 指向自身函数,那么 count 属性的属性值就应该产生变化,但实际上却是纹丝不动。对于这个问题,有些人会利用作用域来解决,比如这么写

又或者更直接的这么写

虽然这两种方式都输出了正确的结果,但是却避开了 this 到底绑定在哪里的问题。如果对一个事物的工作原理不清晰,就往往会产生头痛治头,脚痛治脚的问题,从而导致代码变得的丑陋,而且维护性也会变得很差。

2. this神奇的绑定规则

2.1 默认绑定规则

第一种是最常见的 this 的绑定,看一下下面的代码

函数fn 是直接在全局作用域下调用的,没有带其他任何修饰,这种情况下,函数调用的时候使用了 this 的默认绑定,指向了全局对象。

这样就清楚了第一个例子中的 this 指向, fn 函数中的 this 指向了全局变量,所以 this.count++ 相当于 window.count++(浏览器环境下),当然不会对 fn 函数的count属性产生影响。

有一点要说明的是,上面种情况只能在非严格模式(strict mode)下才能发生,在严格模式下,会将 this 默认绑定为 undefined。以避免全局变量的污染。

2.2 隐式绑定规则

如果函数在以对象为上下文进行调用,那么 this 的绑定就会产生变化。this 会绑定到调用这个函数的对象,查看下面代码:

即使函数声明不在对象当中,this 指向仍会产生变化

由此可见,this 的绑定,不与函数定义的位置有关,而是与调用者和调用方式有关。

在隐式的绑定规则下,有一些特殊的地方,需要注意。

2.2.1 多层对象调用 this 的指向

在多层对象引用下,this 指向的是调用的函数的那个对象。

2.2.2 隐式赋值可能存在丢失现象

查看下面代码

Javascript中神奇的this(javascript gui)

虽然 fn 引用了 obj.fun ,但是函数的调用方式,仍是不带任何修饰的,所以 this 还是绑定在了 window 上。还有一种情况,容易让大家忽略,那就是传参的时候,其实会进行隐式赋值。

隐式绑定 this 不是一种很推荐的方式,因为很有可能就发生丢失的情况,如果业务当中对 this 的绑定有要求,建议还是使用显示绑定的方式。

2.3 显式绑定规则

显示绑定就是利用函数原型上的 apply 与 call 方法来对 this 进行绑定。用法就是把想要绑定的对象作为第一个参数传进去。

有些时候会想将函数的 this 绑定在某个对象上,但是不需要立即调用,这样的话,直接利用 call 或者 apply 是无法做的。

上面这个例子,看似好像可以,但实际上是 bind 函数的 this 绑定到了 obj 这个对象,但是 fn 仍然是没有任何修饰的调用,所以 fn 仍然是默认的绑定方式。

这样调用,就可以将灵活多变的 this ,牢牢的控制住了,因为 fn 的调用方式为 apply 调用。所以,this 就被绑定在传入的 obj 对象上,在 ES5 当中,函数的原型方法上多了一个 bind。效果与上面的函数基本一致,具体用法限于篇幅就不多说了。

2.4 new 绑定

new 是一个被很多人误解的一个关键字,但实际上 javascript 的 new 与传统面向对象的语言完全不同。个人把 new 理解为一种特殊的函数调用,当使用 new 关键字来调用函数的时候,会执行下面操作,

创建一个全新的对象 将空对象的 __proto__ 指向构造函数的 prototype 将新对象的 this 绑定到调用的函数上 如果函数返回值为基本类型或者为 this又或者不返回任何值,那么将会返回这个创建的新对象,如果返回了一个对象,那么则会返回这个对象,而不会返回创建的新对象。

2.5 特殊的传参

null 和 undefined 也是可以作为 this 的绑定对象的,但是实际上应用的是默认的绑定。但是这种传参的实际效用是什么呢?常见的用法是将一个数组展开,作为参数传入参数。比如

但是这种用法会有一个坑,那就是如果函数存在了 this ,那么就会应用默认的绑定规则,将 this 绑定在全局对象上,发生于预期不一致的情况。为了代码更加稳健,可以使创建一个比空对象更空的对象。

Object原型上有一个 create 方法,这个方法会创建一个对象,然后将对象的原型指向传入的参数,所以传入 null 的话,产生一个没有 prototype 的对象,所以会比空对象更加"空"。

所以传入这个对象,会比传入 null 更加安全。

2.6 根据作用域来决定 this 的绑定

在 ES6 当中,出现了一个新的函数类型,箭头函数。

如果使用箭头函数,那么就不会使用上面提到的四种 this 绑定方式,而是根据作用域来决定

比较常见的是用于事件函数和定时器的情况。

下面是比较常见的传统 this 写法

如果使用箭头函数则可以这么写

2.7 事件函数当中 this 的绑定机制

如果是在事件函数当中,this 的绑定是指向触发事件的 DOM 元素的,

点击 body 元素之后,控制台则会显示 body 元素

3. 小结

如果想判断一个函数的 this 绑定在哪里,首先是找到函数的调用位置,之后是按照规则来判断。

如果函数调用时没有任何修饰条件,那么在严格模式下则会绑定到 undefined ,非严格模式下会绑定到全局。 如果是用对象做上下文,来对函数进行调用,那么则会绑定到调用的这个对象上。 如果是用 call 或者 apply 方法来进行调用的,则会绑定到第一个传入参数上。 如果是使用 new 关键字来调用函数的,则会绑定到新创建的那个对象上. 如果是在事件函数内,则会绑定到触发事件的那个DOM元素上。

标签: javascript gui

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

上一篇:javascript实现图片轮播效果(javascript绘制图形)

下一篇:js实现的二分查找算法实例(js二分法排序递归)

  • 个体工商户工商年报资金数额填啥
  • 个人出租非住房房产税怎么计算
  • 不征税收入和免税收入所对应的成本与费用能否税前扣除
  • 发票只有抵扣联没有发票联能不能报销
  • 带息负债融资成本
  • 取得经营所得需要纳税人自行申报嘛
  • 委托加工物资增值税怎么算
  • 债权重组会计分录大全
  • 个体工商户增值税怎么计算
  • 跨年主营业务成本直接冲回可以吗
  • 进口代理费取费标准
  • 长期借款工程完工时会计处理怎么做?
  • 银行结算方式包括哪些内容
  • 小规模纳税人可以出口退税吗
  • 企业盈利后又亏损怎么算
  • 营改增前的工程款现在怎么开票
  • 文化传媒公司的经营模式怎么写
  • 拍卖中,必须规定一切税费由买受人承担吗?
  • 用友t3怎么删除损益结转凭证
  • 注册资本变更需要去税务局吗
  • 小微企业怎么合法避税
  • 分支机构增值税汇总纳税如何申报?
  • 工会财务任务是什么
  • 消费税的纳税地点在哪里
  • 企业增速怎么算
  • 企业所得税一季度盈利二季度亏损
  • 调整应收账款如何做账
  • 企业合并案例
  • 广告公司物料报价清单
  • win10开机强制进入修复模式
  • 会计分录有哪几种形式
  • 厂房拆迁补偿多少钱一平
  • php的缓存文件是什么格式
  • css禁用button按钮
  • 长期债券投资业务处理
  • typescript完全解读
  • ts类型声明 要为某个文件里的变量声明吗
  • lvs命令详解
  • css怎么让文字垂直居中显示
  • 契税属于哪种说法
  • 个人税收收入退税政策
  • phpcms官网打不开
  • 快速显示隐藏单元格
  • mongodb的索引种类
  • 计提工资包含个人扣款吗
  • 营改增一般纳税人可以选择简易计税
  • SQL Server 2008 数据库有哪些版本?
  • sql server 2005 sp4
  • 企业所得税汇算清缴时间
  • 一般纳税人商品暂估按销售的数量可以暂估成本吗
  • 跨月管理费用多计怎么处理
  • 其他债权投资的公允价值变动计入什么科目
  • 待摊费用会计处理
  • 收不回来的账怎么处理
  • 小规模商贸公司没有进项票怎么办
  • 税控盘领了发票怎么发票读入
  • 以前年度损益调整借贷方向
  • 管理会计在企业中的地位如何?为什么
  • 房地产企业发行长期债券的增信方式有哪些
  • 企业清算的会计处理
  • Mysql优化sql方案
  • win7系统摄像头打不开
  • windows pe无法启动怎么办
  • windows server 2008 硬盘格式
  • mac打不了字什么原因
  • mac系统怎么画图
  • 运行ghost
  • ControlSet001、ControlSet002以及CurrentControlSet之间有什么区别
  • win8.1无法更新
  • linux常用命令查询
  • Unity3D游戏开发标准教程
  • unity寻路系统
  • android属性动画
  • bat脚本如何运行
  • python的垃圾处理机制
  • 丰台和朝阳中间是哪里
  • 日常生活中有哪些税
  • 电子税务局app扫脸认证
  • 内蒙古机关事业单位工资调整最新消息
  • 小规模纳税人是按月还是按季度申报增值税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设