事件监听器中this指代问题

我们都知道,事件监听器中的this指代当前元素,换句话说,谁'点'的,就指谁;单一情况好理解,但是,当遇到原型链中的this时,我们有时候就会反应不过来。

今天写百度前端技术学院的题时,就遇到了这样一个问题,于是把它记下来,免得以后忘记。

首先定义了一个Square函数,代码如下:

  1. function Square(x, y, dom) {
  2. this.x = x;
  3. this.y = y;
  4. this.dom = dom;
  5. this.direction = 0;
  6. this.dom.moveTo(this.x, this.y);
  7. }

接着在它的原型链上定义了一个函数:

  1. Square.prototype.go = function() {
  2. switch (this.direction) {
  3. case 0:
  4. this.x = this.x - 1 < 0 ? 0 : this.x - 1; //边界控制
  5. break;
  6. case 90:
  7. this.y = this.y + 1 > 9 ? 9 : this.y + 1;
  8. break;
  9. case 180:
  10. this.x = this.x + 1 > 9 ? 9 : this.x + 1;
  11. break;
  12. case 270:
  13. this.y = this.y - 1 < 0 ? 0 : this.y - 1;
  14. break;
  15. default:
  16. console.log('未知 direction');
  17. }
  18. console.log('this', this);
  19. this.dom.moveTo(this.x, this.y);
  20. }

接着需要把这个函数添加到事件监听器中,一开始的错误代码如下:

 convGo.addEventListener('click',square.go, false);

报错:

可以看出,当前的this引用为button,并非我们预期的square。分析:此时square.go只是一个引用,引用的是go函数本身,回调函数丢失this绑定,事件处理程序把回调函数的this强制绑定到触发事件的DOM元素上。(此处参考《你不知道的JavaScript(上)》P87)。

修正代码如下:

  1. convGo.addEventListener('click', function() {
  2. square.go(); //如果不将square.go()写在匿名函数里,而是直接写square.go,那么go函数里面的额this为convGo
  3. }, false);

结果如图:

分析:将要调用的函数放在一个匿名函数里执行,根据调用位置,go函数里的this会应用隐式绑定。(感觉解释的不好,希望大家多多补充)

代码网址:https://github.com/discoveryLee/BasicTasks/tree/master/task25

(0)

相关推荐

  • Android应用程序----界面事件(按键事件)

    在Android系统中,存在多种界面事件,如点击事件.触摸事件.焦点事件和菜单事件等等 在这些界面事件发生时,Android界面框架调用界面控件的事件处理函数对事件进行处理 按键事件 在MVC模型中, ...

  • Webpack4.0各个击破(8)tapable篇

    目录 一. tapable概述 二. tapable-0.2源码解析 2.1 代码结构 2.2 事件监听方法 2.3 事件触发方法 三. tapable1.0概述 一. tapable概述 tapab ...

  • 事件详解D - 默认行为及DOM2事件

      浏览器的默认行为  JavaScript事件本身所具有的属性,例如 a标签的跳转,Submit按钮的提交,右键菜单,文本框的输入等. 阻止默认行为的方式: event.preventDefault ...

  • Android应用程序----界面事件(触摸事件)

    Android界面框架支持对触摸事件的监听,并能够将触摸事件的详细信息传递给处理函数 需要设置触摸事件的监听器,并重载onTouch ()函数 第1行代码是设置控件的触摸事件监听器 在代码第3行的on ...

  • Android应用程序----UI界面控件

    Android系统的界面控件分为定制控件和系统控件 定制控件是用户独立开发的控件,或通过继承并修改系统控件后所产生的新控件.能够为用户提供特殊的功能或与众不同的显示需求方式 系统控件是Android系 ...

  • 虫粮事件后中储粮祭出黑科技:坐办公室都可查看玉米是否生虫

    其他的不再多说,如果觉得信息有用,也不需要您花钱赞赏,只需点击关注本微信号,并点击一下今天发布的最后一条信息即可. 注:每日粮油仅为传递市场信息,所有观点仅供参考!如有不同见解,欢迎留言交流,或加入每 ...

  • 1956年柏林隧道事件:中情局与克格勃谍战斗法

    <柏林间谍战>剧照 维也纳.柏林.布达佩斯,是冷战时期欧洲三大间谍之都. 从地理位上看,这三座城市都位于中欧,处于美苏两大阵营对峙的最前沿地带. 我们知道,二战后德国及其首都柏林,被美.英 ...

  • 1979年画皮吓死人事件 画皮中的鬼究竟是何物

    上图是朱虹主演的画皮,好多人说这个就是当年吓死过人的电影,我只是笑笑 好多人误认为这个曾是吓死过人的 但不是,那真正吓死过人的画皮又在哪?听我慢慢给你们讲 这个是79年版邵氏电影鬼叫春,好多人误认为这 ...

  • MedDRA及其在不良事件分析中的应用

    陆梦洁, 刘玉秀*  (南京军区南京总医院医务部, 江苏 南京 210002)  摘要: 临床试验的安全性评价很大程度上依赖于对不良事件的深入细致分析.然而, 实践中因受试者地域.语言.民族.文化等不 ...

  • java事件监听器怎么绑定,Java学习笔记(二)事件监听器

    Java实现对组件事件(如单击.输入等)的监听和JavaScript类似,都是先添加Listener,再写触发函数,不同的是,Java实现监听前必须使用implements将各个接口添加到类内. 相关 ...

  • Java学习笔记(四):理解接口 事件监听器

    一.接口 父类和子类比较,父类是一个比子类更抽象的类.这个抽象体现在两个方面:一是父类的属性和方法比子类的少:二是,子类的方法比父类的方法更加具体. 当父类非常抽象时,或者我们仅仅知道这个类的对象应该 ...

  • VAR争议事件连发 中超和德甲使用区别在哪?

    山东鲁能做客上海上港,比赛过程跌宕起伏,本是让球迷大饱眼福的一场盛宴,却因最后时刻的"神剧情",引发中国足球对VAR技术的又一次质疑!这究竟是为什么?比赛第95分钟,吉尔破门却因格 ...

  • 靖康之耻到底有多耻?为何很多事件正史中没有、连史官都不敢写?

    北宋的靖康之耻给南宋军民造成的心里创伤是很大的,南宋有骨气的武将,以岳飞.韩世忠等人为代表的将领们把北伐作为自己一生的目标.其中,我想他们心里压抑的肯定是北伐金国血耻. "靖康耻,犹未雪.臣 ...

  • 【现代远程心电监护】12导联实时可穿戴心电设备在家庭和基层医院患者远程早期事件监测中的应用

    循心电踪迹,探心脏奥秘! 作       者:王晋丽,陈韵岱,郜玲,文冬凌,郭亚涛,石亚君 作者单位:中国人民解放军总医院第一医学中心 基金项目:北京市科委医药协同科技创新研究项目(Z18110000 ...