js中this对象用法分析


Posted in Javascript onJanuary 05, 2018

this对象是在函数运行时,基于函数的执行环境绑定的。

其实这句话的本质就是,谁调用了函数,this就指向谁

具体的来说,通常有以下几种情况:

全局函数

在全局环境中,this指向Window

//例子1
 function A() {
 console.log(this)
 }
 A();//Window

上面的例子很简单,函数A在全局环境中执行,也就是全局对象Window调用了函数。此时this指向Window

对象方法

作为对象方法调用时,this指向调用该方法的对象

//例子2
var b = {
 getThis:function(){
  console.log(this)
 }
}
b.getThis()//b

到这里我们举的例子都比较简单易懂,接下来来一个有意思的:

//例子3
 var c = {
 getFunc:function(){
  return function(){
  console.log(this)
  }
 }
 }
 var cFun = c.getFunc()
 cFun()//Window

这个例子和前一个例子不一样,运行c.getFunc()时,首先返回的是一个匿名函数,我们将这个函数赋值给cFun,接着在全局环境中调用了cFun(),所以此时this指向的还是Window。

如果我们一定要让这里返回的是c对象呢?在开头我们说过,this对象是在函数执行时确定的,在例子3中,执行c.getFunc()时,this对象指向的还是c,所以我们只要保持住这个this就好了,对上面的代码稍微改动:

//例子4
 var c = {
 getFunc:function(){
  var that = this //在这里保留住this
  return function(){
  console.log(that)
  }
 }
 }
 var cFun = c.getFunc()
 cFun()//c

这也就是我们经常可以在一些代码中看到var self = this或者var that = this之类的原因了。

call和apply

此时this对象通常指向函数中指定的this值(注意这里的通常2字,考试要考的)

call和apply算是老生常谈,但还是稍微介绍下,怕新同学可能没接触过(其实是为了凑点字数),拿call来说,语法是这样的

fun.call(thisArg, arg1, arg2, ...)

这个方法怎么用呢,看下面的例子:

//例子5
var d = {
 getThis:function(){
  console.log(this)
 }
}
var e = {
 name:'e'//(给e写个`name`属性只是因为觉得孤零零的太难看了~~)
}
d.getThis.call(e)//e

在这里我们就可以看出call函数的意思了:指定一个对象o1去调用其他对象o2的方法,此时this对象指向o1

好了,那为什么前面我们说通常呢?因为,这里的thisArg是可以指定为null和undefined的。请看:

//例子6
var d = {
 getThis:function(){
  console.log(this)
 }
}
 d.getThis.call(null)//Window
 d.getThis.call(undefined)//Window

此时的this指向全局对象Window

箭头函数

es6中的箭头函数现在也用的比较频繁,但是有个需要注意的点是:

函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。

其实出现这种情况的根本原因是:箭头函数没有this对象,所以箭头函数的this就是外层代码的this

//例子7
 var f = {
  getThis:()=>{
   console.log(this)
  }
 }
 f.getThis()//Window

这个例子和前面例子2是基本一样的,只是把普通函数改写成箭头函数,但是此时的this对象已经指向了外层的Window。

考虑到这一点可能不好理解,我们再看几个例子:

//例子8
 var g = {
 getThis:function(){
  return function(){console.log(this)}
 }
 }
 var h = {
 getThis:function(){
  return ()=> console.log(this)
 }
 }
 g.getThis()()//Window
 h.getThis()()//h

这个例子里,g的getThis写法就和之前的例子3一样,由于函数在全局环境中运行,所以此时this指向Window;h的getThis使用了箭头函数,所以this指向了外层代码块的this所以,此时this指向的是h。

总结

一般情况下this对象指向调用函数的对象,全局环境中执行函数this对象指向Window

在call和apply函数中this指向指定的对象,如果指定的对为undefined或者null,那么this对象指向Window

在箭头函数中,this对象等同于外层代码块的this

然后依然是每次都一样的结尾,如果内容有错误的地方欢迎指出;如果对你有帮助,欢迎点赞和收藏,感谢你对三水点靠木的支持。

Javascript 相关文章推荐
ImageFlow可鼠标控制图片滚动
Jan 30 Javascript
jQuery Select(单选) 模拟插件 V1.3.62 改进版
Jul 17 Javascript
有关DOM元素与事件的3个谜题
Nov 11 Javascript
javascript 内存回收机制理解
Jan 17 Javascript
jquery 绑定回车动作扑捉回车键触发的事件
Mar 26 Javascript
jQuery中click事件的定义和用法
Dec 20 Javascript
js实现的动画导航菜单效果代码
Sep 10 Javascript
阿里巴巴技术文章分享 Javascript继承机制的实现
Jan 14 Javascript
关于JS中match() 和 exec() 返回值和属性的测试
Mar 21 Javascript
AngularJS中的作用域实例分析
May 16 Javascript
js页面加载后执行的几种方式小结
Jan 30 Javascript
vue 页面跳转的实现方式
Jan 12 Vue.js
Node中使用ES6语法的基础教程
Jan 05 #Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
Jan 05 #Javascript
vue脚手架中配置Sass的方法
Jan 04 #Javascript
Angular4学习教程之HTML属性绑定的方法
Jan 04 #Javascript
JS基于for语句编写的九九乘法表示例
Jan 04 #Javascript
JS计算输出100元钱买100只鸡问题的解决方法
Jan 04 #Javascript
Angular4学习教程之DOM属性绑定详解
Jan 04 #Javascript
You might like
PHP 显示客户端IP与服务器IP的代码
2010/10/12 PHP
关于图片的预加载过程中隐藏未知的
2012/12/19 Javascript
简介JavaScript中Boolean.toSource()方法的使用
2015/06/05 Javascript
Jquery插件easyUi实现表单验证示例
2015/12/15 Javascript
js实现分割上传大文件
2016/03/09 Javascript
基于javascript html5实现3D翻书特效
2016/03/14 Javascript
vue实现简单的星级评分组件源码
2018/11/16 Javascript
jQuery实现图片下载代码
2019/07/18 jQuery
node命令行工具之实现项目工程自动初始化的标准流程
2019/08/12 Javascript
Node.js设置定时任务之node-schedule模块的使用详解
2020/04/28 Javascript
js 压缩图片的示例(只缩小体积,不更改图片尺寸)
2020/10/21 Javascript
[01:53]3.19 DOTA2发布会 现场精彩Coser表演
2014/03/25 DOTA
[55:32]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第二场
2018/04/05 DOTA
[01:33]完美世界DOTA2联赛PWL S3 集锦第二期
2020/12/21 DOTA
简单讲解Python编程中namedtuple类的用法
2016/06/21 Python
Python 通过打码平台实现验证码的实现
2019/05/13 Python
PyQt5 实现给窗口设置背景图片的方法
2019/06/13 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
python3实现用turtle模块画一棵随机樱花树
2019/11/21 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
2019/12/31 Python
Python Tornado之跨域请求与Options请求方式
2020/03/28 Python
pycharm 关掉syntax检查操作
2020/06/09 Python
python在CMD界面读取excel所有数据的示例
2020/09/28 Python
很酷的HTML5电子书翻页动画特效
2016/02/25 HTML / CSS
Canvas获取视频第一帧缩略图的实现
2020/11/11 HTML / CSS
英国最大的LED专业零售商:Led Hut
2018/03/16 全球购物
世界上最好的旅行夹克:BauBax
2018/12/23 全球购物
自考毕业生自我鉴定
2013/11/04 职场文书
测控技术与通信工程毕业生自荐信范文
2013/12/28 职场文书
业务部经理岗位职责
2014/01/04 职场文书
活动总结报告范文
2014/05/04 职场文书
毕业大学生自荐信
2014/06/17 职场文书
报效祖国演讲稿
2014/09/15 职场文书
2014年维稳工作总结
2014/11/18 职场文书
学生乘坐校车安全责任书
2015/05/11 职场文书
2016年寒假社会实践活动总结
2015/10/10 职场文书