进阶路上有你我-相互相持篇之ES6里箭头函数里的this指向问题
首先复习下普通函数里的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指向问题的更多相关文章
- iOS进阶指南试读之UI篇
iOS进阶指南试读之UI篇 UI篇 UI是一个iOS开发工程师的基本功.怎么说?UI本质上就是你调用苹果提供给你的API来完成设计师的设计.所以,想提升UI的功力也很简单,没事就看看UIKit里的各个 ...
- NodeJS学习笔记 进阶 (12)Nodejs进阶:crypto模块之理论篇
个人总结:读完这篇文章需要30分钟,这篇文章讲解了使用Node处理加密算法的基础. 摘选自网络 Nodejs进阶:crypto模块之理论篇 一. 文章概述 互联网时代,网络上的数据量每天都在以惊人的速 ...
- 深入理解this机制系列第三篇——箭头函数
× 目录 [1]痛点 [2]解决 [3]基本用法[4]回调函数[5]注意事项 前面的话 this机制与函数调用有关,而作用域则与函数定义有关.有没有什么是可以将this机制和作用域联系起来的呢?本文将 ...
- 和S5933比较起来,开发PLX9054比较不幸,可能是第一次开发PCI的缘故吧。因为,很多PCI的例子都是对S5933,就连微软出版的《Programming the Microsoft Windows Driver Model》都提供了一个完整的S5933的例子。 在这篇有关DDK的开发论文里。
和S5933比较起来,开发PLX9054比较不幸,可能是第一次开发PCI的缘故吧.因为,很多PCI的例子都是对S5933,就连微软出版的<Programming the Microsoft Wi ...
- 【进阶3-2期】JavaScript深入之重新认识箭头函数的this(转)
这是我在公众号(高级前端进阶)看到的文章,现在做笔记 https://github.com/yygmind/blog/issues/21 上篇文章详细的分析了各种this的情况,看过之后对this的概 ...
- Java进阶 JVM 内存与垃圾回收篇(一)
JVM 1. 引言 1.1 什么是JVM? 定义 Java Vritual Machine - java 程序的运行环境(Java二进制字节码的运行环境) 好处 一次编译 ,到处运行 自动内存管理,垃 ...
- labview从入门到出家5(进阶篇)--程序调试以及labview函数库的运用
跟了前面几章的操作流程,相信大家对labview有了一定的认识.其实只要了解了labview的编程思路,再熟悉地运用各个变量,函数以及属性,那么我们就可以打开labview的大门了.跟其他编程语言一样 ...
- [Android进阶]Binder学习(初始篇)
Android中Binder学习(初始篇) 本篇博客学习自侯亮的博客.地址为: 红茶一杯话Binder 1 什么是Binder? 简单地说.Binder是Android平台上的一种跨进程交互技术. 该 ...
- GitHub进阶之利用Git远程仓库篇
#在上一篇文章,相信大家对GitHub已经有了一个基础的理解 接下来我们来学习一下如何利用git来远程仓库 一,git是什么 git:一个免费的开源版本控制软件 用途:利用Git管理GitHub上的代 ...
随机推荐
- Sublime 黑科技之——lorem快速输入
需要一段文字填充某块演示的空间,但不管写什么文字都觉得不合适,那么这个黑科技你值的拥有. 在Sublime Text中,输入lorem,再按Tab键,即可快速输入一段无意义的占位字符: Lorem i ...
- Html中video的属性和方法大全
<video>标签的属性 src :视频的属性 poster:视频封面,没有播放时显示的图片 preload:预加载 autoplay:自动播放 loop:循环播放 controls:浏览 ...
- D1 java概述
首先扯点别的.在学习知识的过程中非常重要的一点是沟通交流,拿自学java来说绝不是抱着一本Head First Java闷头看.感觉自学入门这一阶段相当于启蒙,绝不能向无头苍蝇一样到处乱撞.java的 ...
- 开发Canvas 绘画应用(一):搭好框架
毕业汪今年要毕业啦,毕设做的是三维模型草图检索,年前将算法移植到移动端做了一个小应用(利用nodejs搭的服务),正好也趁此机会可以将前端的 Canvas 好好学一下~~毕设差不多做完了,现将思路和代 ...
- ubuntu下编译小知识点
#改变编译器选项 SET(CMAKE_C_COMPILER"g++") #出现如下错误:添加C++11特性 #error: #error This file requires co ...
- CSS背景样式和列表样式
background-color 设置元素的背景颜色 background-image 把图像设置为背景 background-position 设置背景图像的起始位置 background-atta ...
- 关于java中为什么尽量把受检异常转化为非受检异常
首先理解一下受检异常与非受检异常: 异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机操作中可能遇到的异常,是一种常见的运行错误,只要程序设计的没有问题通常就不会发生.受检异常与程序的上 ...
- scss初学小结(转阮一峰老师SASS用法指南http://www.ruanyifeng.com/blog/2012/06/sass.html)
1.安装 SASS是Ruby语言写的,但是两者的语法没有关系.不懂Ruby,照样使用.只是必须先安装Ruby,然后再安装SASS. 假定你已经安装好了Ruby,接着在命令行输入下面的命令: gem i ...
- SQL中Union和Union All
工作中,看到大佬写的一段SQL,查询了五个表中的数据,最后求某个收入的总和,其中使用了Union All,因此在这里记录一下我从中学到的东西 先上语法 Union: [ Select语句1 ] U ...
- PAT乙级考前总结(二)
简单模拟 1002 写出这个数 (20 分) 1006 换个格式输出整数 (15 分) 又是数数 1016 部分A+B (15 分) 相当于找数字 1018 锤子剪刀布 (20 分) 题目略 此处用了 ...