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 相关文章推荐
不同浏览器对回车提交表单的处理办法
Feb 13 Javascript
Javascript setInterval的两种调用方法(实例讲解)
Nov 29 Javascript
angularJS 中$attrs方法使用指南
Feb 09 Javascript
js实现上传图片预览的方法
Feb 09 Javascript
js+jquery常用知识点汇总
Mar 03 Javascript
使用jquery.qrcode.min.js实现中文转化二维码
Mar 11 Javascript
JS深度拷贝Object Array实例分析
Mar 31 Javascript
chorme 浏览器记住密码后input黄色背景处理方法(两种)
Nov 22 Javascript
详解组件库的webpack构建速度优化
Jun 18 Javascript
jQuery使用jsonp实现百度搜索的示例代码
Jul 08 jQuery
JavaScript实现消消乐的源代码
Jan 12 Javascript
Vue OpenLayer 为地图绘制风场效果
Apr 24 Vue.js
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 mysql 事务处理回滚操作(附实例)
2013/08/05 PHP
Laravel框架表单验证详解
2014/09/04 PHP
PHP fclose函数用法总结
2019/02/15 PHP
php弹出提示框的是实例写法
2019/09/26 PHP
Mac下关于PHP环境和扩展的安装详解
2019/10/17 PHP
javascript学习(二)javascript常见问题总结
2013/01/02 Javascript
THREE.JS入门教程(5)你应当知道的十件事
2013/01/24 Javascript
jquery中交替点击事件toggle方法的使用示例
2013/12/08 Javascript
javascript事件冒泡详解和捕获、阻止方法
2014/04/12 Javascript
实例讲解Jquery中隐藏hide、显示show、切换toggle的用法
2016/05/13 Javascript
Javascript 事件冒泡机制详细介绍
2016/10/10 Javascript
yarn与npm的命令行小结
2016/10/20 Javascript
关于axios不能使用Vue.use()浅析
2018/01/12 Javascript
webuploader分片上传的实现代码(前后端分离)
2018/09/10 Javascript
浅谈Webpack核心模块tapable解析
2018/09/11 Javascript
vue弹出框组件封装实例代码
2019/10/31 Javascript
使用Python解析JSON数据的基本方法
2015/10/15 Python
基于python yield机制的异步操作同步化编程模型
2016/03/18 Python
python3.6 +tkinter GUI编程 实现界面化的文本处理工具(推荐)
2017/12/20 Python
django 模型字段设置默认值代码
2020/07/15 Python
Python 虚拟环境工作原理解析
2020/12/24 Python
FLIR美国官网:热成像, 夜视和红外摄像系统
2018/07/13 全球购物
莫斯科珠宝厂官方网站:Miuz
2020/09/19 全球购物
Python文件操作的面试题
2013/06/22 面试题
求职自荐书范文
2013/12/04 职场文书
竞选班长演讲稿
2013/12/30 职场文书
群众路线教育实践活动方案
2014/02/02 职场文书
投标承诺书范本
2014/03/27 职场文书
公司节能减排倡议书
2014/05/14 职场文书
品牌推广活动策划方案
2014/08/19 职场文书
接收函格式
2015/01/30 职场文书
2015年财务科工作总结范文
2015/05/13 职场文书
赤壁观后感(2)
2015/06/15 职场文书
外科护士长工作总结
2015/08/12 职场文书
宣传委员竞选稿
2015/11/19 职场文书
幼儿园家长心得体会
2016/01/21 职场文书