实例浅析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获取GridView中用户点击控件的行号,列号
Apr 14 Javascript
浅谈javascript中基本包装类型
Jun 03 Javascript
基于jquery实现简单的分页控件
Mar 17 Javascript
bootstrap按钮插件(Button)使用方法解析
Jan 13 Javascript
微信小程序开发之map地图实现教程
Jun 08 Javascript
bootstrap datepicker插件默认英文修改为中文
Jul 28 Javascript
js 中rewrap-ajax.js插件实例代码
Oct 20 Javascript
浅谈如何使用 webpack 优化资源
Oct 20 Javascript
Vue2.0 v-for filter列表过滤功能的实现
Sep 07 Javascript
详解ES6 系列之异步处理实战
Oct 26 Javascript
Javascript作用域和作用域链原理解析
Mar 03 Javascript
jQuery实现颜色打字机的完整代码
Mar 19 jQuery
解析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
这部好评如潮的动漫 知名梗频出 但是画风劝退很多人
2020/03/08 日漫
PHP初学者最感迷茫的问题小结
2010/03/27 PHP
Linux下创建nginx脚本-start、stop、reload…
2014/08/03 PHP
thinkphp配置连接数据库技巧
2014/12/02 PHP
Yii把CGridView文本框换成下拉框的方法
2014/12/03 PHP
php 修改上传文件大小限制实例详解
2016/10/23 PHP
利用php-cli和任务计划实现刷新token功能的方法
2017/05/03 PHP
javascript Array.remove() 数组删除
2009/08/06 Javascript
10款非常有用的 Ajax 插件分享
2012/03/14 Javascript
js变换显示图片的实例
2013/04/16 Javascript
jQuery实现用户注册的表单验证示例
2013/08/28 Javascript
JS实现点击图片在当前页面放大并可关闭的漂亮效果
2013/10/18 Javascript
判断JS对象是否拥有某种属性的两种方式
2013/12/02 Javascript
JavaScript实现移动端滑动选择日期功能
2016/06/21 Javascript
JS制作适用于手机和电脑的通知信息效果
2016/10/28 Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
2017/08/14 Javascript
js form表单input框限制20个字符,10个汉字代码实例
2019/04/12 Javascript
JavaScript 格式化数字、金额、千分位、保留几位小数、舍入舍去
2019/07/23 Javascript
python获取指定时间差的时间实例详解
2017/04/11 Python
Python字典数据对象拆分的简单实现方法
2017/12/05 Python
详解django+django-celery+celery的整合实战
2019/03/19 Python
元组列表字典(莫烦python基础)
2019/04/03 Python
Python中的__init__作用是什么
2020/06/09 Python
Python Selenium XPath根据文本内容查找元素的方法
2020/12/07 Python
详解canvas绘图时遇到的跨域问题
2018/03/22 HTML / CSS
世界最大的票务市场:viagogo
2017/02/16 全球购物
经济实惠的豪华背包和行李袋:Packs Project
2018/10/17 全球购物
Big Green Smile法国:领先的英国有机和天然产品在线商店
2021/01/02 全球购物
C语言中一个结构不能包含指向自己的指针吗
2012/05/25 面试题
公司采购主管岗位职责
2014/06/17 职场文书
2014年学生会干事工作总结
2014/11/07 职场文书
实习单位证明范例
2014/11/17 职场文书
2015年档案管理工作总结
2015/04/08 职场文书
员工表扬信怎么写
2015/05/05 职场文书
pt-archiver 主键自增
2022/04/26 MySQL
vue-cli3.x配置全局的scss的时候报错问题及解决
2022/04/30 Vue.js