JavaScript this 深入理解


Posted in Javascript onJuly 30, 2009

最近一段时间看了很多JavaScript 的库源码, 如 prototype, Ext core 等。这些库中大量应用到了这一概念。直到昨天翻了一下《JavaScript王者归来》这本书才算对this有一个深刻的理解。
大至归结一下:
1. 函数调用者与所有者
JavaScript 中函数(function) 存在调用者 与 所有者这两个概念,调用者是指调用函数的对象,通常是一个指向调用了当前函数的函数的引用,如果是顶层调用,那么caller=null, 大部分浏览器的JavaScript实现 可以用 caller 这个属性获得(这不是 ECMAScript 规范的一部分,所有还是慎用)。 从以下的代码能够很好的理解这点:

function a(){ 
alert('fun a caller=' + a.caller); 
} 
function b(){ 
a(); 
} 
a(); 
b();

-----------
运行结果可以看到两个对话框:
1.
fun a caller=null;
2.
fun a caller=function b(){
a();
}
--------------------------
而对于所有者,则是指调用函数的对象(一个动态的概念), 在函数体中的this就是指向了函数的所有者。在这里的this 与 Java 以及 C++ 中的 this指针是完全不同的两个概念,很多人忽略了这一点,这也是导致 JavaScript中的this无法很好理解的原因之一。看看以下的例子:
var oa = { 
x:1, 
y:2 
} 
var ob = { 
x:11, 
y:12 
} 
function a(w){ 
alert(w + "=" + this.x + "," + this.y) 
} 
a("?"); 
oa.fun = a; 
oa.fun("a"); 
ob.fun = a; 
ob.fun("b");

---------
一开始的调用 a() 这时未指定所有者,一般这种情况 this 是指向浏览器的顶层元素 window 的, 而window中未定义x 与 y 属性。
所以结果显示为: ?=undefined,undefined
oa.fun = a; oa.fun("a"); 将函数引用赋值给对像a的属性fun, 这时再调用函数的所有者变成了a, 则结果显示为:a=1,2
同理 ob.fun("b")则显示:b=11,12。
在JavaScript中要改变一个函数的所有者(this)的方法就是将函数引用赋值给一个对象的属性。
同是在Function对象中也提供了两个原型函数可以实现这一功能: apply, call, 这两个函数的第一个参数就是要指定的所有者对象,它们间的唯一区别就是apply将其后的要传递给函数的形参封装到数组中,或者直接用 arguments对象。而call则直接将形参跟在其后。
因此上面的 oa.fun=a; oa.fun("a") 可以改写成 a.apply(oa, ["a"]) 或 a.call(oa, "a");
ob.fun=b; ob.fun("b") 可以改写成 a.apply(ob, ["b"]) 或 b.call(ob, "b");
知道了以上这此,对于 this 的作用域及其使用就很好理解了。

下面是一些参考文档
javascript this用法小结
https://3water.com/article/16863.htm

JavaScript this 深入理解
https://3water.com/article/19425.htm

JAVASCRIPT THIS详解 面向对象
https://3water.com/article/17584.htm

Javascript this指针
https://3water.com/article/19434.htm

JavaScript中this关键字使用方法详解
https://3water.com/article/7954.htm

Javascript this关键字使用分析
https://3water.com/article/16235.htm

Javascript 相关文章推荐
懒就要懒到底——鼠标自动点击(含时间判断)
Feb 20 Javascript
javascript 图片裁剪技巧解读
Nov 15 Javascript
JQuery中attr方法和removeAttr方法用法实例
May 18 Javascript
再次谈论Javascript中的this
Jun 23 Javascript
JS中split()用法(将字符串按指定符号分割成数组)
Oct 24 Javascript
前端编码规范(3)JavaScript 开发规范
Jan 21 Javascript
JS去掉字符串末尾的标点符号及删除最后一个字符的方法
Oct 24 Javascript
jQuery实现图片上传预览效果功能完整实例【测试可用】
May 28 jQuery
微信小程序实现图片上传功能
May 28 Javascript
JavaScript实现随机点名器实例详解
May 07 Javascript
Vue如何使用混合Mixins和插件开发详解
Feb 05 Javascript
JS面向对象编程基础篇(一) 对象和构造函数实例详解
Mar 03 Javascript
Google Map API更新实现用户自定义标注坐标
Jul 29 #Javascript
JavaScript Konami Code 实现代码
Jul 29 #Javascript
JavaScript 获取事件对象的注意点
Jul 29 #Javascript
javascript CSS画图之基础篇
Jul 29 #Javascript
JQuery 表格操作(交替显示、拖动表格行、选择行等)
Jul 29 #Javascript
JavaScript 设计模式学习 Factory
Jul 29 #Javascript
JQuery UI皮肤定制
Jul 27 #Javascript
You might like
浅析iis7.5安装配置php环境
2015/05/10 PHP
thinkphp3.2实现上传图片的控制器方法
2016/04/28 PHP
PHP的中使用非缓冲模式查询数据库的方法
2017/02/05 PHP
js 效率组装字符串 StringBuffer
2009/12/23 Javascript
关于删除时的提示处理(确定删除吗)
2013/11/03 Javascript
JS实现定时页面弹出类似QQ新闻的提示框
2013/11/07 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
2015/05/25 Javascript
利用Vue.js+Node.js+MongoDB实现一个博客系统(附源码)
2017/04/24 Javascript
js实现手机web图片左右滑动效果
2017/12/29 Javascript
JS实现的简单拖拽购物车功能示例【附源码下载】
2018/01/03 Javascript
微信小程序上传图片实例
2018/05/28 Javascript
微信小程序与公众号实现数据互通的方法
2019/07/25 Javascript
Element-ui el-tree新增和删除节点后如何刷新tree的实例
2020/08/31 Javascript
js+canvas绘制图形验证码
2020/09/21 Javascript
[41:13]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第一场 11.20
2020/11/20 DOTA
Python图算法实例分析
2016/08/13 Python
numpy.linspace 生成等差数组的方法
2018/07/02 Python
Python3字符串encode与decode的讲解
2019/04/02 Python
基于python的ini配置文件操作工具类
2019/04/24 Python
使用python爬取抖音视频列表信息
2019/07/15 Python
使用turtle绘制五角星、分形树
2019/10/06 Python
翻转数列python实现,求前n项和,并能输出整个数列的案例
2020/05/03 Python
浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式
2020/05/25 Python
国贸专业个人求职信分享
2013/12/04 职场文书
婚礼证婚人证婚词
2014/01/08 职场文书
委托证明的格式
2014/01/10 职场文书
声乐专业大学生职业生涯规划书:理想的未来需要自己去打造
2014/09/20 职场文书
机关班子查摆问题及整改措施
2014/10/28 职场文书
2014年节能减排工作总结
2014/12/06 职场文书
2015政治思想表现评语
2015/03/25 职场文书
幼儿园综治宣传月活动总结
2015/05/07 职场文书
2015年终个人政治思想工作总结
2015/11/24 职场文书
中职班主任培训心得体会
2016/01/07 职场文书
个人业务学习心得体会
2016/01/25 职场文书
导游词之江南园林狮子林
2019/09/16 职场文书
查看nginx配置文件路径和资源文件路径的方法
2021/03/31 Servers