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的面向对象(一)
Nov 09 Javascript
javascript模拟post提交隐藏地址栏的参数
Sep 03 Javascript
jquery插件推荐 jquery.cookie
Nov 09 Javascript
jQuery悬停文字提示框插件jquery.tooltipster.js用法示例【附demo源码下载】
Jul 19 Javascript
AngularJS过滤器filter用法实例分析
Nov 04 Javascript
如何编写jquery插件
Mar 29 jQuery
jQuery实现Select下拉列表进行状态选择功能
Mar 30 jQuery
JS组件系列之JS组件封装过程详解
Apr 28 Javascript
VsCode新建VueJs项目的详细步骤
Sep 23 Javascript
vue登录路由验证的实现
Dec 13 Javascript
JS面向对象的程序设计相关知识小结
May 26 Javascript
基于vue2.0的活动倒计时组件countdown(附源码下载)
Oct 09 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
destoon会员注册提示“数据校验失败(2)”解决方法
2014/06/21 PHP
跟我学Laravel之视图 & Response
2014/10/15 PHP
详解php用curl调用接口方法,get和post两种方式
2017/01/13 PHP
PHP使用finfo_file()函数检测上传图片类型的实现方法
2017/04/18 PHP
PHP实现中国公民身份证号码有效性验证示例代码
2017/05/03 PHP
得到文本框选中的文字,动态插入文字的js代码
2007/03/07 Javascript
javascript引导程序
2008/10/26 Javascript
jQuery asp.net 用json格式返回自定义对象
2010/04/07 Javascript
原生js验证简洁注册登录页面
2016/12/17 Javascript
JS实现一次性弹窗的方法【刷新后不弹出】
2016/12/26 Javascript
AngularJS实现使用路由切换视图的方法
2017/01/24 Javascript
Vue.use源码分析
2017/04/22 Javascript
微信小程序中使用javascript 回调函数
2017/05/11 Javascript
javascript、php关键字搜索函数的使用方法
2018/05/29 Javascript
vue.js 2.0实现简单分页效果
2019/07/29 Javascript
vue页面切换项目实现转场动画的方法
2019/11/12 Javascript
JavaScript正则表达式验证登录实例
2020/03/18 Javascript
[02:35]DOTA2超级联赛专访XB 难忘一年九冠称王
2013/06/20 DOTA
深入理解python中的select模块
2017/04/23 Python
Python数据结构之图的应用示例
2018/05/11 Python
pycharm 主题theme设置调整仿sublime的方法
2018/05/23 Python
Python连接Mssql基础教程之Python库pymssql
2018/09/16 Python
python中for循环输出列表索引与对应的值方法
2018/11/07 Python
从0开始的Python学习016异常
2019/04/08 Python
Python3 pandas 操作列表实例详解
2019/09/23 Python
使用python切片实现二维数组复制示例
2019/11/26 Python
python 基于卡方值分箱算法的实现示例
2020/07/17 Python
Python confluent kafka客户端配置kerberos认证流程详解
2020/10/12 Python
法国创作个性化T恤衫和其他定制产品平台:Tostadora
2018/04/08 全球购物
实习生个人的自我评价
2013/12/08 职场文书
总经理助理工作职责
2014/02/06 职场文书
奥巴马上海演讲稿
2014/09/10 职场文书
专家推荐信范文
2015/03/26 职场文书
走进科学观后感
2015/06/18 职场文书
国富论读书笔记
2015/06/26 职场文书
2016银行招聘自荐信
2016/01/28 职场文书