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 相关文章推荐
JQuery 操作Javascript对象和数组的工具函数小结
Jan 22 Javascript
js日历功能对象
Jan 12 Javascript
Javascript获取当前日期的农历日期代码
Oct 08 Javascript
面向切面编程(AOP)的理解
May 01 Javascript
javascript生成不重复的随机数
Jul 17 Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
Nov 25 Javascript
BootStrap初学者对弹出框和进度条的使用感觉
Jun 27 Javascript
炫酷的js手风琴效果
Oct 13 Javascript
Webpack中css-loader和less-loader的使用教程
Apr 27 Javascript
React组件之间的通信的实例代码
Jun 27 Javascript
jQuery/JS监听input输入框值变化实例
Oct 17 jQuery
JS创建或填充任意长度数组的小技巧汇总
Oct 24 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
新的一年,新的期待:DC在2020年的四部动画电影
2020/01/01 欧美动漫
怎样在UNIX系统下安装php3
2006/10/09 PHP
PHP简单系统查询模块代码打包下载
2008/06/07 PHP
php HtmlReplace输入过滤安全函数
2010/07/03 PHP
PHP采集静态页面并把页面css,img,js保存的方法
2014/12/23 PHP
PHP将URL转换成短网址的算法分享
2016/09/13 PHP
php微信公众平台配置接口开发程序
2016/09/22 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
PHP实现权限管理功能示例
2017/09/22 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
获取页面高度,窗口高度,滚动条高度等参数值getPageSize,getPageScroll
2006/09/22 Javascript
js 省地市级联选择
2010/02/07 Javascript
Jquery 实现Tab效果 思路是js思路
2010/03/02 Javascript
ExtJs中简单的登录界面制作方法
2010/08/19 Javascript
node.js中的http.response.addTrailers方法使用说明
2014/12/14 Javascript
js实现透明度渐变效果的方法
2015/04/10 Javascript
jquery+ajax实现直接提交表单实例分析
2016/06/17 Javascript
AngularJs  E2E Testing 详解
2016/09/02 Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
2016/10/24 Javascript
性能优化之代码优化页面加载速度
2017/03/01 Javascript
Mint-UI时间组件起始时间问题及时间插件使用
2018/08/20 Javascript
JS简单判断是否在微信浏览器打开的方法示例
2019/01/08 Javascript
vue项目中引入Sass实例方法
2019/08/27 Javascript
微信小程序实现横向滚动导航栏效果
2019/12/12 Javascript
JavaScript 替换所有匹配内容及正则替换方法
2020/02/12 Javascript
[01:12]快闪回顾DOTA2亚洲邀请赛(DAC) 静候2018新征程开启
2018/03/11 DOTA
Python编程生成随机用户名及密码的方法示例
2017/05/05 Python
Python 反转字符串(reverse)的方法小结
2018/02/20 Python
浅述python中深浅拷贝原理
2018/09/18 Python
canvas 绘图时位置偏离的问题解决
2020/09/16 HTML / CSS
Java多态性的定义以及类型
2014/09/16 面试题
车贷收入证明范本
2014/01/09 职场文书
职工运动会邀请函
2014/01/19 职场文书
幼儿园实习生辞职信
2014/01/20 职场文书
四风问题查摆剖析材料
2014/10/11 职场文书
浅谈Python数学建模之整数规划
2021/06/23 Python