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 相关文章推荐
javascript 去字符串空格终极版(支持utf8)
Nov 14 Javascript
jquery 双色表格实现代码
Dec 08 Javascript
ASP中Sub和Function的区别说明
Aug 30 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
Sep 02 Javascript
javascript日期计算实例分析
Jun 29 Javascript
Angular2库初探
Mar 01 Javascript
Vue2.0 vue-source jsonp 跨域请求
Aug 04 Javascript
jQuery Datatables表头不对齐的解决办法
Nov 27 jQuery
详解VUE 数组更新
Dec 16 Javascript
关于jquery layui弹出层的使用方法
Apr 21 jQuery
Node.js 进程平滑离场剖析小结
Jan 24 Javascript
原生JS实现的跳一跳小游戏完整实例
Jan 27 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
使PHP自定义函数返回多个值
2006/11/26 PHP
PHP echo,print,printf,sprintf函数之间的区别与用法详解
2013/11/27 PHP
PHP数组相加操作及与array_merge的区别浅析
2016/11/26 PHP
搭建自己的PHP MVC框架详解
2017/08/16 PHP
PHP命令空间namespace及use的用法小结
2017/11/27 PHP
CSDN轮换广告图片轮换效果
2007/03/27 Javascript
jquery select(列表)的操作(取值/赋值)
2009/08/06 Javascript
javascript中运用闭包和自执行函数解决大量的全局变量问题
2010/12/30 Javascript
jquery实现加载等待效果示例
2013/09/25 Javascript
jQuery调用RESTful WCF示例代码(GET方法/POST方法)
2014/01/26 Javascript
easyui Draggable组件实现拖动效果
2015/08/19 Javascript
jQuery实现的AJAX简单弹出层效果代码
2015/11/26 Javascript
jQuery进行组件开发完整实例
2015/12/15 Javascript
jquery删除table当前行的实例代码
2016/10/07 Javascript
简单的vuex 的使用案例笔记
2018/04/13 Javascript
详解nodejs http请求相关总结
2019/03/31 NodeJs
Nuxt使用Vuex的方法示例
2019/09/06 Javascript
微信小程序实现签到弹窗动画
2020/09/21 Javascript
JavaScript构造函数原理及实现流程解析
2020/11/19 Javascript
详解Python中列表和元祖的使用方法
2015/04/25 Python
Python实现一个简单的验证码程序
2017/11/03 Python
python实现对指定字符串补足固定长度倍数截断输出的方法
2018/11/15 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
2020/02/12 Python
python3读取autocad图形文件.py实例
2020/06/05 Python
精致的手工皮鞋:Shoe Embassy
2019/11/08 全球购物
个人求职简历的自我评价
2013/10/19 职场文书
入职担保书怎么写
2014/05/12 职场文书
2014年大学生党员评议表自我评价
2014/09/20 职场文书
考试作弊被抓检讨书
2014/10/02 职场文书
服务整改报告
2014/11/06 职场文书
2015年教师节新闻稿
2015/07/17 职场文书
高中历史教学反思
2016/02/19 职场文书
写作技巧:如何撰写一份优秀的营销策划书
2019/08/13 职场文书
导游词之昭君岛
2020/01/17 职场文书
JS监听Esc 键触发事键
2021/04/14 Javascript
升级 Win11 还是坚守 Win10?微软 Win11 新系统缺失功能大盘点
2022/04/05 数码科技