JavaScript中this的使用详解


Posted in Javascript onNovember 08, 2013

我们要记住一句话:this永远指向函数运行时所在的对象!而不是函数被创建时所在的对象。切记…
本文将分三种情况来分析this对象到底身处何方。
普通函数中的this
无论this身处何处,第一要务就是要找到函数运行时的位置。

1 var name="全局";
2 function getName(){
3     var name="局部";
4     return this.name;
5 };
6 alert(getName());

当this出现在全局环境的函数getName中时,此时函数getName运行时的位置在
alert(getName());

显然,函数getName所在的对象是全局对象,即window,因此this的安身之处定然在window。此时的this指向window对象,则getName返回的this.name其实是window.name,因此alert出来的是“全局”!
那么,当this不是出现在全局环境的函数中,而是出现在局部环境的函数中时,又会身陷何方呢?
1 var name="全局";
2 var twobin={
3     name:"局部",
4     getName:function(){
5         return this.name;
6     }
7 };
8 alert(twobin.getName());

其中this身处的函数getName不是在全局环境中,而是处在twobin环境中。无论this身处何处,一定要找到函数运行时的位置。此时函数getName运行时的位置
alert(twobin.getName());

显然,函数getName所在的对象是twobin,因此this的安身之处定然在twobin,即指向twobin对象,则getName返回的this.name其实是twobin.name,因此alert出来的是“局部”!
闭包中的this
闭包也是个不安分子,本文暂且不对其过于赘述,简而言之:所谓闭包就是在一个函数内部创建另一个函数,且内部函数访问了外部的变量。
浪子this与痞子闭包混在一起,可见将永无宁日啊!
 1 var name="全局";
 2 var twobin={
 3     name:"局部",
 4     getName:function(){
 5         return function(){
 6             return this.name;
 7         };
 8     }
 9 };
10 alert(twobin.getName()());

此时的this明显身处困境,竟然处在getName函数中的匿名函数里面,而该匿名函数又调用了变量name,因此构成了闭包,即this身处闭包中。
无论this身处何处,一定要找到函数运行时的位置。此时不能根据函数getName运行时的位置来判断,而是根据匿名函数的运行时位置来判断。
function (){
    return this.name;
};

显然,匿名函数所在的对象是window,因此this的安身之处定然在window,则匿名函数返回的this.name其实是window.name,因此alert出来的就是“全局”!
那么,如何在闭包中使得this身处在twobin中呢?
  var name="全局";
  var twobin={
      name:"局部",
      getName:function(){
          var that=this;
          return function(){
              return that.name;
          };
      }
 };
 alert(twobin.getName()());

在getName函数中定义that=this,此时getName函数运行时位置在
alert(twobin.getName());
则this指向twobin对象,因此that也指向twobin对象。在闭包的匿名函数中返回that.name,则此时返回的that.name其实是twobin.name,因此就可以alert出来 “局部”!
call与apply中的this
在JavaScript中能管的住this的估计也就非call与apply莫属了。
call与apply就像this的父母一般,让this住哪它就得住哪,不得不听话!
 var name="全局";
 var twobin={
name:"局部",
};
function getName(){
    alert(this.name);
}
getName(twobin);
getName.call(twobin);

其中this身处函数getName中。无论this身处何处,一定要找到函数运行时的位置。此时函数getName运行时的位置
getName(twobin);
显然,函数getName所在的对象是window,因此this的安身之处定然在window,即指向window对象,则getName返回的this.name其实是window.name,因此alert出来的是“全局”!
那么,该call与apply登场了,因为this必须听他们的指挥!
getName.call(twobin);
其中,call指定this的安身之处就是在twobin对象,因为this被迫只能在twobin那安家,则此时this指向twobin对象, this.name其实是twobin.name,因此alert出来的是“局部”!
一点总结
浪子this:永远指向函数运行时所在的对象,而不是函数被创建时所在的对象;如果处在匿名函数中或不处于任何对象中,则this指向window对象;如果是call或apply,它指定哪个对象,则this就指向哪个对象!
Javascript 相关文章推荐
用javascript实现的支持lrc歌词的播放器
May 17 Javascript
由JavaScript技术实现的web小游戏(不含网游)
Jun 12 Javascript
下拉列表select 由左边框移动到右边示例
Dec 04 Javascript
JavaScript实现跨浏览器的添加及删除事件绑定函数实例
Aug 04 Javascript
jQuery实现鼠标滑过点击事件音效试听
Aug 31 Javascript
jquery 表单验证之通过 class验证表单不为空
Nov 02 Javascript
javascript发送短信验证码实现代码
Nov 12 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
Jan 25 Javascript
JavaScript 中 apply 、call 的详解
Mar 21 Javascript
JavaScript满天星导航栏实现方法
Mar 08 Javascript
node 文件上传接口的转发的实现
Sep 23 Javascript
Node快速切换版本、版本回退(降级)、版本更新(升级)
Jan 07 Javascript
jqGrid日期格式的判断示例代码(开始日期与结束日期)
Nov 08 #Javascript
JQuery验证jsp页面属性是否为空(实例代码)
Nov 08 #Javascript
原生js做的手风琴效果的导航菜单
Nov 08 #Javascript
jquery 日期控件datepicker属性详细解析
Nov 08 #Javascript
jquery增加时编辑jqGrid(实例代码)
Nov 08 #Javascript
jqueyr判断checkbox组的选中(示例代码)
Nov 08 #Javascript
iframe子父页面调用js函数示例
Nov 07 #Javascript
You might like
从一个不错的留言本弄的mysql数据库操作类
2007/09/02 PHP
php中3种方法统计字符串中每种字符的个数并排序
2012/08/27 PHP
PHP生成压缩文件实例
2015/02/07 PHP
PHP之正则表达式捕获组与非捕获组(详解)
2015/07/29 PHP
php微信开发之百度天气预报
2016/11/18 PHP
浅析PHP7 的垃圾回收机制
2019/09/06 PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
2020/03/16 PHP
Google Map API更新实现用户自定义标注坐标
2009/07/29 Javascript
让JavaScript 轻松支持函数重载 (Part 1 - 设计)
2009/08/04 Javascript
jtable列中自定义button示例代码
2013/11/21 Javascript
2014 HTML5/CSS3热门动画特效TOP10
2014/12/07 Javascript
jquery实现的用户注册表单提示操作效果代码分享
2015/08/28 Javascript
jquery ajax局部加载方法详解(实现代码)
2016/05/12 Javascript
jquery的ajax提交form表单的两种方法小结(推荐)
2016/05/25 Javascript
js判断请求的url是否可访问,支持跨域判断的实现方法
2016/09/17 Javascript
微信小程序 video组件详解
2016/10/25 Javascript
Bootstrap基本样式学习笔记之表单(3)
2016/12/07 Javascript
BootStrap中
2016/12/10 Javascript
js定时器实现倒计时效果
2017/11/05 Javascript
浅谈Angular文字折叠展开组件的原理分析
2017/11/24 Javascript
jquery 输入框查找关键字并提亮颜色的实例代码
2018/01/23 jQuery
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
React倒计时功能实现代码——解耦通用
2020/09/18 Javascript
基于ajax实现上传图片代码示例解析
2020/12/03 Javascript
python进阶教程之异常处理
2014/08/30 Python
Python对称的二叉树多种思路实现方法
2020/02/28 Python
Selenium基于PIL实现拼接滚动截图
2020/04/10 Python
解决Jupyter Notebook使用parser.parse_args出现错误问题
2020/04/20 Python
python爬虫容易学吗
2020/06/02 Python
Django --Xadmin 判断登录者身份实例
2020/07/03 Python
Python中三维坐标空间绘制的实现
2020/09/22 Python
The Hut美国/加拿大:英国领先的豪华在线百货商店
2019/03/26 全球购物
Servlet如何得到服务器的信息
2015/12/22 面试题
研修第一天随笔感言
2014/02/15 职场文书
关爱留守儿童主题班会
2015/08/13 职场文书
导游词之韩国济州岛
2019/10/28 职场文书