首先复习下普通函数里的this指向:

 function test(){
console.log(this)
}
test()

你会秒杀的毫无疑问的回答:window,针对普通函数谁调用了函数  函数里的this就指向谁,test()等价于window.test(),所以是window

 var name="outername"
var o={
name:"innername",
getname:function(){
console.log(this.name)
}
}
o.getname()

这个是普通函数,谁调用了函数  函数里的this就指向谁,o.getname(),调用这个getname函数的是o这个对象,这个o对象下面有name:"innername",所以打印出的是 "innername"

怎么还不见ES6里的箭头函数呢?别急马上登场:看我变身

 var name="outername"
var o={
name:"innername",
getname:()=>{
console.log(this.name)
}
}
o.getname()

哇,箭头函数出来了,o.getname()执行后,因为箭头函数坐镇,我不敢轻易的说,因为调用getname()的是o对象,所以this指向o对象,哦NO,可是人家不是普通函数,人家是箭头函数,哪就猜相反的那个var name="outername",它会打印外面的那个name("outername"),恭喜你,答对了,原因下面会讲解。

 var name="outername"
var o={
name:"innername",
getname:function(){
return ()=>this.name }
}
console.log(o.getname()())

箭头函数继续出现,那么这个会打印出什么呢?不想猜的我直接敲出代码打印出来答案:"innername",为什么?箭头函数的this对象:就是定义时所在的对象,而不是使用时所在的对象,也就是根据外层(函数或者全局)作用域来决定this,再最后个例子一并总结.

 var name="outername"
var o={
name:"innername",
getname:function(){
setTimeout(()=>console.log(this.name),1000) }
}
o.getname()

待我先总结完后自己可以先去猜下没有给出答案的答案.

总结:

普通函数this指向谁调用了函数  函数里的this就指向谁

箭头函数的this指向:就是定义时所在的对象,而不是使用时所在的对象,也就是根据外层(函数或者全局)作用域来决定this

调用的函数类型:

①箭头函数:this指向window

②普通函数:this指向调用这个普通函数的对象,可能这个普通函数里有箭头函数,否管它,即使这个普通函数里有箭头函数,这个箭头函数的this依旧是调用这个普通函数的对象

小结以上调用的函数是普通函数缺内嵌箭头函数的例子:

 var name="outername"
var o={
name:"innername",
getname:function(){
return ()=>this.name }
}
console.log(o.getname()())
 var name="outername"
var o={
name:"innername",
getname:function(){
setTimeout(()=>console.log(this.name),1000) }
}
o.getname()

this对象的指向是可变的,但是在箭头函数中,它是固定的。

 function foo() {
setTimeout(() => {
console.log('id:', this.id);
}, 100);
} var id = 21; foo.call({ id: 42 });
// id: 42

上面代码中,setTimeout的参数是一个箭头函数,这个箭头函数的定义生效是在foo函数生成时,而它的真正执行要等到 100 毫秒后。如果是普通函数,执行时this应该指向全局对象window,这时应该输出21。但是,箭头函数导致this总是指向函数定义生效时所在的对象(本例是{id: 42}),所以输出的是42

希望此篇认清ES6箭头函数里的this指向,对你有用。

进阶路上有你我-相互相持篇之ES6里箭头函数里的this指向问题的更多相关文章

  1. iOS进阶指南试读之UI篇

    iOS进阶指南试读之UI篇 UI篇 UI是一个iOS开发工程师的基本功.怎么说?UI本质上就是你调用苹果提供给你的API来完成设计师的设计.所以,想提升UI的功力也很简单,没事就看看UIKit里的各个 ...

  2. NodeJS学习笔记 进阶 (12)Nodejs进阶:crypto模块之理论篇

    个人总结:读完这篇文章需要30分钟,这篇文章讲解了使用Node处理加密算法的基础. 摘选自网络 Nodejs进阶:crypto模块之理论篇 一. 文章概述 互联网时代,网络上的数据量每天都在以惊人的速 ...

  3. 深入理解this机制系列第三篇——箭头函数

    × 目录 [1]痛点 [2]解决 [3]基本用法[4]回调函数[5]注意事项 前面的话 this机制与函数调用有关,而作用域则与函数定义有关.有没有什么是可以将this机制和作用域联系起来的呢?本文将 ...

  4. 和S5933比较起来,开发PLX9054比较不幸,可能是第一次开发PCI的缘故吧。因为,很多PCI的例子都是对S5933,就连微软出版的《Programming the Microsoft Windows Driver Model》都提供了一个完整的S5933的例子。 在这篇有关DDK的开发论文里。

    和S5933比较起来,开发PLX9054比较不幸,可能是第一次开发PCI的缘故吧.因为,很多PCI的例子都是对S5933,就连微软出版的<Programming the Microsoft Wi ...

  5. 【进阶3-2期】JavaScript深入之重新认识箭头函数的this(转)

    这是我在公众号(高级前端进阶)看到的文章,现在做笔记 https://github.com/yygmind/blog/issues/21 上篇文章详细的分析了各种this的情况,看过之后对this的概 ...

  6. Java进阶 JVM 内存与垃圾回收篇(一)

    JVM 1. 引言 1.1 什么是JVM? 定义 Java Vritual Machine - java 程序的运行环境(Java二进制字节码的运行环境) 好处 一次编译 ,到处运行 自动内存管理,垃 ...

  7. labview从入门到出家5(进阶篇)--程序调试以及labview函数库的运用

    跟了前面几章的操作流程,相信大家对labview有了一定的认识.其实只要了解了labview的编程思路,再熟悉地运用各个变量,函数以及属性,那么我们就可以打开labview的大门了.跟其他编程语言一样 ...

  8. [Android进阶]Binder学习(初始篇)

    Android中Binder学习(初始篇) 本篇博客学习自侯亮的博客.地址为: 红茶一杯话Binder 1 什么是Binder? 简单地说.Binder是Android平台上的一种跨进程交互技术. 该 ...

  9. GitHub进阶之利用Git远程仓库篇

    #在上一篇文章,相信大家对GitHub已经有了一个基础的理解 接下来我们来学习一下如何利用git来远程仓库 一,git是什么 git:一个免费的开源版本控制软件 用途:利用Git管理GitHub上的代 ...

随机推荐

  1. WEBBASE篇: 第十一篇, JavaScript知识6

    JavaScript 知识6 一, String 对象 1,分隔字符串, 函数: split(seperator) 作用: 将字符串,通过seperator 拆分成一个数组: eg: var msg= ...

  2. linux下mysql的启动与关闭

    1.查看mysql版本 方法一:status; 方法二:select version(); 2.Mysql启动.停止.重启常用命令 a.启动方式 1.使用 service 启动: [root@loca ...

  3. 网上流行护眼色的RGB值

  4. curl请求

    <?php $cookie_file = tempnam('./temp','cookie');  //创建cookie文件保存的位置/** * [curl description] * @pa ...

  5. [Java Web学习]junit.framework.AssertionFailedError: No tests found in {Class}

    No tests found in com.XXXXX.XXX.inboundPrepService.bizLogic.prepDeterminationEngine.workers.Determin ...

  6. QT5.10+VS2013 TCP 一对一简单C/S架构通信

    ---恢复内容开始--- QT~俺老孙又回来啦~ 买的那本书上面关于tcp的内容就七八页,而且都是过于简单的东西,想进一步就要度娘很久很麻烦,还是喜欢看书(嘿嘿嘿~) 大致的思路就是两个项目,一个cl ...

  7. 自己用的vim插件

    一.Plugin 'VundleVim/Vundle.vim'. 二.Plugin 'Valloric/YouCompleteMe' let g:ycm_server_python_interpret ...

  8. 使用s3fs-fuse 挂载minio s3 对象存储

    minio 是一个aws s3 兼容的对象存储系统,我们可以通过s3fs 进行数据桶的挂载,这样可以做好多方便的事情 环境准备 使用docker-compose 运行 minio docker-com ...

  9. Spring Boot的日志配置

    一.配置logback日志 Spring Boot默认使用logback打印日志 需要增加依赖 <groupId>org.springframework.boot</groupId& ...

  10. select大表报错

    MySQL查询大表报错 MySQL执行select操作时候,如果执行查询的表的数据量比较大,就会报错error code 2013.或者报错已杀死,并直接退出MySQL客户端.如下所示: mysql& ...