实例浅析js的this


Posted in Javascript onDecember 11, 2016

js的this是什么?关于这个东西,博客园里面有太多的解释了,不过,本人看了一下,感觉对this解释的有点复杂了,因此,本人在此给this一个简单易于理解的定义。

this其实是js的一个对象,至于是什么对象呢?很简单,this这个对象就是:谁调用它它就指向谁。

关于这一点,其实,博客园的文章已经说明了很多了,有的文章也说到了点子上,只不过,他们解释的还是有点模糊,这里,我给大家做几个简单的对照实验,根据这几个对照实验的结果,大家应该很清楚了。

希望大家根据我的代码重复实现下面的实验。

首先,我们来看下面的代码:

//创建一个局部对象a
var a = {
 user:'小东',
 getName:function(){
  return this.user;//返回当前对象的user属性值
 }
}
//调用a的getName方法
alert(a.getName());

上面的代码会输出什么呢?没错,这里alert的是····小东····,很简单,这里是在a对象的内部调用this嘛,肯定是a对象调用this,所以根据···········谁调用this它就指向谁这个定义···········,那么这里的this指向的就是a对象。

接下来,我们再给上面的代码添加一行:

//创建一个局部对象a
var a = {
 user:'小东',
 getName:function(){
  return this.user;//返回当前对象的user属性值
 }
}
//调用a的getName方法
alert(a.getName());
//把局部对象的属性函数赋值给外面的变量out
var out = a.getName;
//调用out函数
alert(out());

根据上面的实验结果,我们知道直接调用a.getName输出的是小东,对吧?那么,我们把a.getName这个属性函数赋值给out变量之后,再来调用out会输出什么呢?结果是:undefined的。为什么会是undefined的?请思考一会。要是你明白这里为什么输出的是undefined的原因,那么,我想你对this的理解已经很清楚了。但是,如果,你对本文感兴趣,你还是可以继续看下去的。

这里,我先不解释为什么在外面引用a对象的getName函数却得不到a对象里面的值,我们转过弯来讲,请看下面的代码(其实和上面的代码是差不多的,呵呵):

//创建一个局部对象a
var a = {
 user:'小东',
 getName:function(){
 return 1;//这里我们不返回this,而是返回1
}
}
//调用a的getName方法
alert(a.getName());
//把局部对象的属性函数赋值给外面的变量out
var out = a.getName;
//调用out函数
alert(out());

上面的代码很简单吧,这里,我们不在a对象的getName属性函数里面返回a对象的东西,而是返回···1·····,那么,此刻你再调用out函数,你觉得会输出什么呢?没错,你得到的不再是····undefined····的,而是一个实实在在的数字····1······。这就奇怪了,是吧?当a.getName函数返回的是a对象里面的user属性时,我们用out来引用a.getName函数时,我们得到的是undefined的结果,而当a.getName函数返回的是1时,我们再用out引用a.getName函数却可以得到a.getName里面的东西?这是怎么回事呢?

原因很简单,当我们调用外面的全局变量out的时候,this它指向的应该out的对象,而不是a对象,而out的对象是谁呢?我们应该知道,js在全局中声明的变量的对象是window对象吧。既然调用out时,this指向的是window,那么函数out=a.getName=function(){return this.user;}里面的this.user我们应该写出window.user对吧?但是,此刻,全局变量中有没有一个window.user的属性值呢?没有吧?既然没有window.user这个属性值,那么我们alert(window.user)肯定是undefined啦。为了证明这一点,我们来做下面的实验:

//创建一个局部对象a
var a = {
 user:'小东',
 getName:function(){
  return this.user;//返回当前对象的user属性值
 }
}
//调用a的getName方法
alert(a.getName());
//把局部对象的属性函数赋值给外面的变量out
var out = a.getName;
//我们增加一个window.user的全局属性,看看再次调用out函数会输出什么
var window.user='window"s username';
//调用out函数
alert(out());

此刻,当你再执行上面的代码时,你会发现,out函数输出的不再是undefined,而是window's username,这证明了什么?证明了当out调用this时,this确实指向了window,同时也证明了,this确实是:谁调用它它就指向谁。

如果你不理解js的全局变量,那么,我们可以把上面的代码换成下面的代码再来调用out,你就更加明白了:

//创建一个局部对象a
var a = {
 user:'小东',
 getName:function(){
  return this.user;//返回当前对象的user属性值
 }
}
//调用a的getName方法
alert(a.getName());
//把局部对象的属性函数赋值给外面的变量out
var out = a.getName;
//此刻,我们增加一个user的变量,看看再次调用out函数会输出什么
var user='window"s username';
//调用out函数
alert(out());

这里,我们不再启用window这个对象,对于外面的属性和函数,我们一律都用var 来声明,既然都用var来声明,那么他们应该都指向同一个对象吧?此刻,你再执行上面的代码,也就是执行out函数,依然可以alert出window's username。行文到此,this的定义已经再明白不过了,它就是:谁调用它它就指向谁。

this不难理解,难以理解的是,你要找到那个调用它的········对象·····,只有找到调用this的对象,你才知道this到底指向谁,因为:this的定义就是:谁调用它它就指向谁。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
在JavaScript中使用inline函数的问题
Mar 08 Javascript
jquery及原生js获取select下拉框选中的值示例
Oct 25 Javascript
基于jquery扩展漂亮的CheckBox(自己编写)
Nov 19 Javascript
jQuery中用dom操作替代正则表达式
Dec 29 Javascript
js实现简易的单数字随机抽奖(0-9)
Mar 19 Javascript
jquery实现简单的遮罩层
Jan 08 Javascript
jQuery时间插件jquery.clock.js用法实例(5个示例)
Jan 14 Javascript
详解本地Node.js服务器作为api服务器的解决办法
Feb 28 Javascript
js中事件对象和事件委托的介绍
Jan 21 Javascript
react写一个select组件的实现代码
Apr 03 Javascript
vue表单中遍历表单操作按钮的显示隐藏示例
Oct 30 Javascript
PHP 502bad gateway原因及解决方案
Nov 13 Javascript
解析js如何获取css样式
Dec 11 #Javascript
BootStrap轮播HTML代码(推荐)
Dec 10 #Javascript
JQuery.validationEngine表单验证插件(推荐)
Dec 10 #Javascript
JS产生随机数的用法小结
Dec 10 #Javascript
基于JavaScript实现随机颜色输入框
Dec 10 #Javascript
BootStrap中
Dec 10 #Javascript
jQuery Ajax请求后台数据并在前台接收
Dec 10 #Javascript
You might like
在线竞拍系统的PHP实现框架(二)
2006/10/09 PHP
php使用Image Magick将PDF文件转换为JPG文件的方法
2015/04/01 PHP
基于PHP实现假装商品限时抢购繁忙的效果
2015/10/16 PHP
php文件上传你必须知道的几点
2015/10/20 PHP
jQuery的一些注意
2006/12/06 Javascript
收集的网上用的ajax之chat.js文件
2007/04/08 Javascript
基于jquery的大众点评,分类导航实现代码
2011/08/23 Javascript
jQuery Tools Dateinput使用介绍
2012/07/14 Javascript
使用apply方法处理数组的三个技巧[译]
2012/09/20 Javascript
jQuery 选择器项目实例分析及实现代码
2012/12/28 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
2014/05/03 Javascript
JavaScript操作XML/HTML比较常用的对象属性集锦
2015/10/30 Javascript
JavaScript中Function函数与Object对象的关系
2015/12/17 Javascript
基于JavaScript短信验证码如何实现
2016/01/24 Javascript
Bootstrap树形组件jqTree的简单封装
2016/01/25 Javascript
基于Vue框架vux组件库实现上拉刷新功能
2017/11/28 Javascript
vue+webpack模拟后台数据的示例代码
2018/07/26 Javascript
Vue项目全局配置页面缓存之按需读取缓存的实现详解
2018/08/01 Javascript
微信小程序视图控件与bindtap之间的问题的解决
2019/04/08 Javascript
JS实现的检验身份证格式并输出出生日期,年龄,性别,出生地示例
2019/05/17 Javascript
jQuery实现可编辑的表格
2019/12/11 jQuery
小程序实现图片移动缩放效果
2020/05/26 Javascript
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
2015/04/25 Python
Python迭代器定义与简单用法分析
2018/04/30 Python
TensorFlow实现iris数据集线性回归
2018/09/07 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
2019/05/16 Python
python pandas获取csv指定行 列的操作方法
2019/07/12 Python
如何用 Python 处理不平衡数据集
2021/01/04 Python
使用css3制作登录表单的步骤
2014/04/07 HTML / CSS
HTML5 图片预加载的示例代码
2020/03/25 HTML / CSS
iRobot官网:改变生活的家用机器人品牌
2016/09/20 全球购物
xxx同志考察材料
2014/02/07 职场文书
工商管理专业大学生职业生涯规划范文
2014/03/09 职场文书
大专生自我鉴定怎么写
2014/09/16 职场文书
HTML5简单实现添加背景音乐的几种方法
2021/05/12 HTML / CSS
解决spring.thymeleaf.cache=false不起作用的问题
2022/06/10 Java/Android