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 相关文章推荐
Javascript常考语句107条收集
Mar 09 Javascript
jquery操作checkbox实现全选和取消全选
May 02 Javascript
jQuery选择器源码解读(五):tokenize的解析过程
Mar 31 Javascript
js跨浏览器的事件侦听器和事件对象的使用方法
Dec 17 Javascript
JavaScript 节流函数 Throttle 详解
Jul 04 Javascript
纯js实现悬浮按钮组件
Dec 17 Javascript
AngularJs实现聊天列表实时刷新功能
Jun 15 Javascript
Angular4开发解决跨域问题详解
Aug 28 Javascript
vue将时间戳转换成自定义时间格式的方法
Mar 02 Javascript
8 个有用的JS技巧(推荐)
Jul 03 Javascript
vue+springboot实现登录验证码
May 27 Vue.js
JS数组去重详情
Nov 07 Javascript
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
咖啡的传说和历史
2021/03/03 新手入门
PHP4 与 MySQL 交互使用
2006/10/09 PHP
PHP语言中global和$GLOBALS[]的分析 之二
2012/02/02 PHP
Zend Framework中的简单工厂模式 图文
2012/07/10 PHP
php读取mysql中文数据出现乱码的解决方法
2013/08/16 PHP
php导出word格式数据的代码实例
2013/11/25 PHP
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
2013/12/25 PHP
php获取url参数方法总结
2014/11/13 PHP
PHP利用APC模块实现文件上传进度条的方法
2015/01/26 PHP
php取出数组单个值的方法
2018/03/12 PHP
jquery控制左右箭头滚动图片列表的实例
2013/05/20 Javascript
javascript实现无限级select联动菜单
2015/01/02 Javascript
js实现数字每三位加逗号的方法
2015/02/05 Javascript
jQuery焦点图切换特效代码分享
2015/09/15 Javascript
浅谈jQuery操作类数组的工具方法
2016/12/23 Javascript
js+div+css下拉导航菜单完整代码分享
2016/12/28 Javascript
使用vue和datatables进行表格的服务器端分页实例代码
2017/06/07 Javascript
使用JS实现导航切换时高亮显示的示例讲解
2018/08/22 Javascript
vue动态添加路由addRoutes之不能将动态路由存入缓存的解决
2019/02/19 Javascript
nodejs对项目下所有空文件夹创建gitkeep的方法
2019/08/02 NodeJs
JavaScript 监听组合按键思路及代码实现
2020/07/28 Javascript
python列表操作使用示例分享
2014/02/21 Python
Python开发常用的一些开源Package分享
2015/02/14 Python
Python多进程并发与多线程并发编程实例总结
2018/02/08 Python
python使用Plotly绘图工具绘制柱状图
2019/04/01 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
2019/07/24 Python
Python Gitlab Api 使用方法
2019/08/28 Python
pyCharm 实现关闭代码检查
2020/06/09 Python
小白教你PyCharm从下载到安装再到科学使用PyCharm2020最新激活码
2020/09/25 Python
CSS改变网页中鼠标选中文字背景颜色例子
2014/04/23 HTML / CSS
程序员岗位职责
2013/11/11 职场文书
关于工资低的辞职信
2014/01/14 职场文书
《灰椋鸟》教学反思
2014/04/27 职场文书
2014年有孩子的离婚协议书范本
2014/10/08 职场文书
2020年元旦祝福语录,总有适合你的
2019/12/31 职场文书
简单聊聊Vue中的计算属性和属性侦听
2021/10/05 Vue.js