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 相关文章推荐
JavaScript用JQuery呼叫Server端方法示例代码
Sep 03 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
Feb 26 Javascript
jQuery多条件筛选如何实现
Nov 04 Javascript
JavaScript进阶练习及简单实例分析
Jun 03 Javascript
Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法
Jun 23 Javascript
Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)
Jul 31 Javascript
JavaScript 正则命名分组【推荐】
Jun 07 Javascript
详解小程序原生使用ES7 async/await语法
Aug 06 Javascript
浅谈vue方法内的方法使用this的问题
Sep 15 Javascript
element-ui 中使用upload多文件上传只请求一次接口
Jul 19 Javascript
Vue实现商品飞入购物车效果(电商项目)
Nov 26 Javascript
解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题
Nov 05 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
浅谈socket同步和异步、阻塞和非阻塞、I/O模型
2016/12/15 PHP
php无限级评论嵌套实现代码
2018/04/18 PHP
客户端 使用XML DOM加载json数据的方法
2010/09/28 Javascript
jquery form 隐藏的input 选择
2014/04/29 Javascript
JS实现向表格行添加新单元格的方法
2015/03/30 Javascript
JavaScript获取网页中第一个图片id的方法
2015/04/03 Javascript
jquery实现的横向二级导航效果代码
2015/08/26 Javascript
Web程序员必备的7个JavaScript函数
2016/06/14 Javascript
r.js来合并压缩css文件的示例
2018/04/26 Javascript
使用 electron 实现类似新版 QQ 的登录界面效果(阴影、背景动画、窗体3D翻转)
2018/10/23 Javascript
vue-router beforeEach跳转路由验证用户登录状态
2018/12/26 Javascript
vue组件中iview的modal组件爬坑问题之modal的显示与否应该是使用v-show
2019/04/12 Javascript
vue实现修改图片后实时更新
2019/11/14 Javascript
vue如何使用async、await实现同步请求
2019/12/09 Javascript
javascript Canvas动态粒子连线
2020/01/01 Javascript
Python使用ConfigParser模块操作配置文件的方法
2018/06/29 Python
利用Python进行数据可视化常见的9种方法!超实用!
2018/07/11 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
2018/12/18 Python
Python 3 使用Pillow生成漂亮的分形树图片
2019/12/24 Python
python Shapely使用指南详解
2020/02/18 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
2020/05/09 Python
python属于跨平台语言码
2020/06/09 Python
HTML5通用接口详解
2016/06/12 HTML / CSS
美国真皮手袋品牌:GiGi New York
2017/03/10 全球购物
豪华床上用品、床单和浴室必需品:Peacock Alley
2019/09/04 全球购物
简历中个人求职的自我评价模板
2013/11/29 职场文书
银行实习鉴定
2013/12/13 职场文书
社区庆中秋节活动方案
2014/02/07 职场文书
物理系毕业生自荐书范文
2014/02/22 职场文书
《水乡歌》教学反思
2014/04/24 职场文书
横幅标语大全
2014/06/17 职场文书
动漫设计与制作专业推荐信
2014/07/07 职场文书
离婚协议书怎么写(范本参考)
2014/09/30 职场文书
2014年服务员工作总结
2014/11/18 职场文书
实习单位推荐信
2015/03/27 职场文书
Python面向对象编程之类的概念
2021/11/01 Python