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 相关文章推荐
jquery插件制作 图片走廊 gallery
Aug 17 Javascript
jQuery实现的原图对比窗帘效果
Jun 15 Javascript
文本框倒叙输入让输入框的焦点始终在最开始的位置
Sep 01 Javascript
Javascript中String的常用方法实例分析
Jun 13 Javascript
基于javascript实现仿百度输入框自动匹配功能
Jan 03 Javascript
Bootstrap table使用方法详细介绍
Dec 09 Javascript
JS回调函数基本定义与用法实例分析
May 24 Javascript
Jquery EasyUI $.Parser
Jun 02 jQuery
微信小程序request请求后台接口php的实例详解
Sep 20 Javascript
Vue.js组件高级特性实例详解
Dec 24 Javascript
微信小程序自定义导航栏实例代码
Apr 05 Javascript
Openlayers显示瓦片网格信息的方法
Sep 28 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
PHP开发制作一个简单的活动日程表Calendar
2016/06/20 PHP
PHP中如何判断exec函数执行成功?
2016/08/04 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
为原生js Array增加each方法
2012/04/07 Javascript
『JavaScript』限制Input只能输入数字实现思路及代码
2013/04/22 Javascript
extjs ColumnChart设置不同的颜色实现代码
2013/05/17 Javascript
JS实现文件动态顺序载入的方法
2015/03/07 Javascript
实例详解angularjs和ajax的结合使用
2015/10/22 Javascript
angularjs表格ng-table使用备忘录
2016/03/09 Javascript
JavaScript中实现无缝滚动、分享到侧边栏实例代码
2016/04/06 Javascript
JS基于递归实现倒计时效果的方法
2016/11/26 Javascript
如何使用angularJs
2017/05/08 Javascript
原生JS实现隐藏显示图片 JS实现点击切换图片效果
2021/01/27 Javascript
angular2+node.js express打包部署的实战
2017/07/27 Javascript
Web技术实现移动监测的介绍
2017/09/18 Javascript
基于Vue实现图书管理功能
2017/10/17 Javascript
vue.js父子组件通信动态绑定的实例
2018/09/28 Javascript
小程序封装路由文件和路由方法(5种全解析)
2019/05/26 Javascript
Node.js 路由的实现方法
2019/06/05 Javascript
使用Vue实现调用接口加载页面初始数据
2019/10/28 Javascript
微信小程序scroll-view隐藏滚动条的方法详解
2020/03/25 Javascript
Python的Bottle框架的一些使用技巧介绍
2015/04/08 Python
python实现的正则表达式功能入门教程【经典】
2017/06/05 Python
解决Django的request.POST获取不到内容的问题
2018/05/28 Python
python绘制热力图heatmap
2020/03/23 Python
Python标准库使用OrderedDict类的实例讲解
2019/02/14 Python
pytorch 预训练层的使用方法
2019/08/20 Python
学python安装的软件总结
2019/10/12 Python
美国派对用品及装饰品网上商店:Shindigz
2016/07/30 全球购物
汽车专业大学生职业生涯规划范文
2014/01/07 职场文书
教师师德表现自我评价
2015/03/05 职场文书
2015年端午节活动方案
2015/05/05 职场文书
信用卡工资证明范本
2015/06/19 职场文书
《吃水不忘挖井人》教学反思
2016/02/22 职场文书
导游词之南京莫愁湖公园
2019/11/13 职场文书
Python字典的基础操作
2021/11/01 Python