JavaScript call apply使用 JavaScript对象的方法绑定到DOM事件后this指向问题


Posted in Javascript onSeptember 28, 2011

先来看看现象:

<html> 
<head> 
<title>apply_and_call</title> 
</head> 
<body onload="init()"> 
<div id="testDiv" style="position: absolute; border: 1px solid gray; width:100px; height: 100px"></div> 
<script type="text/javascript"> 
function init() { 
var el = document.getElementById("testDiv"); 
var a = new classA(el); 
} 
function classA(el) { 
this.a = 1; 
this.container = el; 
//绑定单击事件 
this.container.onclick = this.click; 
} 
classA.prototype = { 
click:function() { 
alert(this.a); 
} 
} 
</script> 
</body> 
</html>

当单击DIV后,弹出框显示undefined。
原因是当DOM对象响应单击事件后,事件方法中的this关键字指向的是DOM对象,此时DOM对象没有a属性,所以弹出undefined。
而程序员本意是响应事件方法中this指向的是classA的对象a,如何才能达到此目的?这就需要使用到call或apply方法。
下面再来熟悉下call方法:
摘要:
function.call(thisobj, args…)
参数:
thisobj

调用function的对象。在函数主体中,thisobj是关键字this的值。
args…

任意多个参数,这些参数将传递给函数function。
返回值:
调用函数function的返回值。
抛出:
TypeError

如果调用该函数的对象不是函数,则抛出该异常。
描述:
call()将指定的函数function作为对象thisobj的方法来调用,把参数列表中thisobj后的参数传递给它,返回值是调用函数后的返回值。在函数体内,关键字this引用thisobj对象。
如果将指定数组作为传递给函数的参数,请使用Function.apply()方法。
熟悉call()方法后,将代码1修改如下:
代码2:

<html> 
<head> 
<title>apply_and_call</title> 
</head> 
<body onload="init()"> 
<div id="testDiv" style="position: absolute; border: 1px solid gray; width:100px; height: 100px"></div> 
<script type="text/javascript"> 
function init() { 
var el = document.getElementById("testDiv"); 
var a = new classA(el); 
} 
function classA(el) { 
this.t = 1; 
this.clickDele = createDele(this.click, this); 
el.onclick = this.clickDele; 
} 
classA.prototype = { 
click:function() { 
alert(this.t); 
} 
} 
function createDele(fun, obj, arg) { 
return function() { 
return fun.call(obj, arg); 
} 
} 
</script> 
</body> 
</html>

代码2 25行:主要添加了createDele方法,该方法包含三个参数:fun、obj、arg,分别是“要执行的方法”、“fun中this需要指向的对象”、“传入fun中的参数”。该方法返回一个匿名方法。
匿名方法负责执行fun方法,同时将fun中的this指向obj,并使用作为arg传入参数,处理结果返回。
当程序执行走到第15行调用createDele方法,传入对象的方法和对象本身,createDele接收参数后返回一个匿名方法,this.clickDele被设置成为返回的匿名方法,16行代码将this.clickDele(匿名方法)绑定到DOM事件上,程序执行完毕,点击DOM(DIV)触发匿名方法,些时匿名方法中fun为之前传入的this.click(即:方法a.click),obj为之前传入的this(即:对象a),所以此时使用call方法使得this.click(即:方法a.click)中的this指向obj(即:对象a),最终弹出结果为1。结果正确,达到了程序的本意。
回顾匿名方法多少会让人感到有些怪异:调用匿名方法时fun为什么会是this.click(即:方法a.click)、obj什么为是this(即:对象a)。这个问题就需要用JavaScript的闭包来解释了,这里暂不介绍闭包,后面会有介绍JavaScript闭包的文章发表,欢迎有兴趣的朋友持续关注!
不管各位看官信还是不信,反正道理和程序是没有问题的!:)
Javascript 相关文章推荐
select 控制网页内容隐藏于显示的实现代码
May 25 Javascript
javascript闭包的理解和实例
Aug 12 Javascript
jQuery实现自动滚动到页面顶端的方法
May 22 Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
Mar 08 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
Apr 26 Javascript
jquery+ajax+text文本框实现智能提示完整实例
Jul 09 Javascript
AngularJs定制样式插入到ueditor中的问题小结
Aug 01 Javascript
ionic由于使用了header和subheader导致被遮挡的问题的两种解决方法
Sep 22 Javascript
JavaScript定时器setTimeout()和setInterval()详解
Aug 18 Javascript
浅谈angular2路由预加载策略
Oct 04 Javascript
微信小程序实现获取自己所处位置的经纬度坐标功能示例
Nov 30 Javascript
vue制作抓娃娃机的示例代码
Apr 17 Javascript
javascript权威指南 学习笔记之变量作用域分享
Sep 28 #Javascript
关于setInterval、setTimeout在jQuery中的使用注意事项
Sep 28 #Javascript
jQuery Ajax 仿AjaxPro.Utility.RegisterTypeForAjax辅助方法
Sep 27 #Javascript
Ext.get() 和 Ext.query()组合使用实现最灵活的取元素方式
Sep 26 #Javascript
一个挺有意思的Javascript小问题说明
Sep 26 #Javascript
Jquery之Ajax运用 学习运用篇
Sep 26 #Javascript
jQuery+CSS 实现随滚动条增减的汽水瓶中的液体效果
Sep 26 #Javascript
You might like
CI框架数据库查询之join用法分析
2016/05/18 PHP
PHP实现表单提交时去除斜杠的方法
2016/12/26 PHP
golang、python、php、c++、c、java、Nodejs性能对比
2017/03/12 NodeJs
PHP Class SoapClient not found解决方法
2018/01/20 PHP
字符串的replace方法应用浅析
2011/12/06 Javascript
jquery实现表格奇数偶数行不同样式(有图为证及实现代码)
2013/01/23 Javascript
改变文件域的样式实现思路同时兼容ie、firefox
2013/10/23 Javascript
JavaScript定义变量和变量优先级问题探讨
2014/10/11 Javascript
jQuery学习笔记之jQuery中的$
2015/01/19 Javascript
PHP中CURL的几个经典应用实例
2015/01/23 Javascript
js实现跨域的多种方法
2015/12/25 Javascript
浅谈js里面的InttoStr和StrtoInt
2016/06/14 Javascript
妙用Bootstrap的 popover插件实现校验表单提示功能
2016/08/29 Javascript
从0开始学Vue
2016/10/27 Javascript
AngularJS封装$http.post()实例详解
2017/05/06 Javascript
Vue 处理表单input单行文本框的实例代码
2019/05/09 Javascript
[02:09]DOTA2辉夜杯 EHOME夺冠举杯现场
2015/12/28 DOTA
python中的列表推导浅析
2014/04/26 Python
Python常用知识点汇总
2016/05/08 Python
python图片验证码生成代码
2016/07/02 Python
python opencv设置摄像头分辨率以及各个参数的方法
2018/04/02 Python
python检索特定内容的文本文件实例
2018/06/05 Python
python flask解析json数据不完整的解决方法
2019/05/26 Python
Python定时任务APScheduler的实例实例详解
2019/07/22 Python
手把手教你进行Python虚拟环境配置教程
2020/02/03 Python
python利用百度云接口实现车牌识别的示例
2020/02/21 Python
如何利用python检测图片是否包含二维码
2020/10/15 Python
CSS3属性选择符介绍
2008/10/17 HTML / CSS
CSS3教程(1):什么是CSS3
2009/04/02 HTML / CSS
5分钟让你掌握css3阴影、倒影、渐变小技巧(小编推荐)
2016/08/15 HTML / CSS
html5 datalist 选中option选项后的触发事件
2020/03/05 HTML / CSS
美国最大的户外装备和服装购物网站:Backcountry
2019/10/15 全球购物
园林设计师自荐信
2013/11/18 职场文书
小学语文教学反思
2014/02/10 职场文书
医院财务人员岗位职责
2015/04/14 职场文书
2015年车间管理工作总结
2015/07/23 职场文书