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 相关文章推荐
JS获取文本框,下拉框,单选框的值的简单实例
Feb 26 Javascript
用box固定长宽实现图片自动轮播js代码
Jun 09 Javascript
Bootstrap模态框水平垂直居中与增加拖拽功能
Nov 09 Javascript
js将字符串中的每一个单词的首字母变为大写其余均为小写
Jan 05 Javascript
基于Vue实例对象的数据选项
Aug 09 Javascript
jquery层次选择器的介绍
Jan 18 jQuery
详解Node.js一行命令上传本地文件到服务器
Apr 22 Javascript
Express结合Webpack的全栈自动刷新
May 23 Javascript
vue的webcamjs集成方式
Nov 16 Javascript
ES6字符串的扩展实例
Dec 21 Javascript
vue+spring boot实现校验码功能
May 27 Vue.js
让JavaScript代码更加精简的方法技巧
Jun 01 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 将图片按创建时间进行分类存储的实现代码
2010/01/05 PHP
用PHP的超级变量$_POST获取HTML表单(HTML Form) 数据
2011/05/07 PHP
深入解析PHP的Yii框架中的缓存功能
2016/03/29 PHP
jquery.validate分组验证代码
2011/03/17 Javascript
读jQuery之二(两种扩展)
2011/06/11 Javascript
JavaScript表达式:URL 协议介绍
2013/03/10 Javascript
jquery和ajax的关系详细介绍
2013/11/29 Javascript
动态加载jQuery的方法
2015/06/16 Javascript
jquery实现的蓝色二级导航条效果代码
2015/08/24 Javascript
Bootstrap企业网站实战项目4
2016/10/14 Javascript
原生node.js案例--前后台交互
2017/02/20 Javascript
Vue-cli proxyTable 解决开发环境的跨域问题详解
2017/05/18 Javascript
基于构造函数的五种继承方法小结
2017/07/27 Javascript
Angular服务Request异步请求的实例讲解
2018/08/13 Javascript
React 组件渲染和更新的实现代码示例
2019/02/21 Javascript
VsCode与Node.js知识点详解
2019/09/05 Javascript
JavaScript鼠标拖拽事件详解
2020/04/03 Javascript
如何在Express4.x中愉快地使用async的方法
2020/11/18 Javascript
python多线程http下载实现示例
2013/12/30 Python
Python实现的Google IP 可用性检测脚本
2015/04/23 Python
使用paramiko远程执行命令、下发文件的实例
2017/10/01 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
2018/08/02 Python
我喜欢你 抖音表白程序python版
2019/04/07 Python
Python中py文件转换成exe可执行文件的方法
2019/06/14 Python
解决Python中pandas读取*.csv文件出现编码问题
2019/07/12 Python
python3+opencv生成不规则黑白mask实例
2020/02/19 Python
Windows系统下pycharm中的pip换源
2020/02/23 Python
python编写实现抽奖器
2020/09/10 Python
html5 自定义播放器核心代码
2013/12/20 HTML / CSS
美国眼镜网站:EyeBuyDirect
2017/04/13 全球购物
小学语文教学反思
2014/02/10 职场文书
任命书模板
2014/06/04 职场文书
庆七一宣传标语
2014/10/08 职场文书
《小蝌蚪找妈妈》教学反思
2016/02/23 职场文书
Python Pandas知识点之缺失值处理详解
2021/05/11 Python
十大动画制作软件,Adobe产品上榜两款,第一是行业标准软件
2022/03/18 杂记