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

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

1 function test(){
2     console.log(this)
3 }
4 test()

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

1 var name="outername"
2 var o={
3     name:"innername",
4     getname:function(){
5         console.log(this.name)
6     }
7 }
8 o.getname()

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

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

1 var name="outername"
2 var o={
3     name:"innername",
4     getname:()=>{
5         console.log(this.name)
6     }
7 }
8 o.getname()

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

1 var name="outername"
2 var o={
3     name:"innername",
4     getname:function(){
5        return ()=>this.name
6
7     }
8 }
9 console.log(o.getname()())

箭头函数继续出现,那么这个会打印出什么呢?不想猜的我直接敲出代码打印出来答案:"innername",为什么?箭头函数的this指向:箭头函数在定义时已经决定 所以永远指向window,说好的window下面的name("outername")呢?难道说错了,?稍安勿躁,再最后个例子一并总结.

1 var name="outername"
2 var o={
3     name:"innername",
4     getname:function(){
5        setTimeout(()=>console.log(this.name),1000)
6
7     }
8 }
9 o.getname()

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

总结:

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

箭头函数的this指向:箭头函数在定义时已经决定 所以永远指向window

调用的函数类型:

①箭头函数:this指向window

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

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

1 var name="outername"
2 var o={
3     name:"innername",
4     getname:function(){
5        return ()=>this.name
6
7     }
8 }
9 console.log(o.getname()())
1 var name="outername"
2 var o={
3     name:"innername",
4     getname:function(){
5        setTimeout(()=>console.log(this.name),1000)
6
7     }
8 }
9 o.getname()

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

原文地址:https://www.cnblogs.com/studyshufei/p/9061713.html

时间: 2024-10-17 18:38:45

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

从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十六 ║ Vue前篇:ES6初体验 & 模块化

缘起 昨天说到了<从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十五 ║ Vue前篇:JS对象&字面量&this>,通过总体来看,好像大家对这一块不是很感兴趣,嗯~~这一块确实挺枯燥的,不能直接拿来代码跑一下那种,不过还是得说下去,继续加油吧!如果大家对昨天的小demo练习的话,相信现在已经对JS的面向对象写法很熟悉了,如果嵌套字面量定义函数,如何使用this关键字指向.今天呢,主要说一下ES6中的一些特性技巧,然后简单说一下模块化的问题,好啦,开始今天的讲

XE6移动开发环境搭建之IOS篇(4):VMware9里安装Mac OSX 10.8(有图有真相)

XE6移动开发环境搭建之IOS篇(4):VMware9里安装Mac OSX 10.8(有图有真相) 2014-08-18 21:10 网上能找到的关于Delphi XE系列的移动开发环境的相关文章甚少,本文尽量以详细的内容.傻瓜式的表达来告诉你想要的答案. 以下内容比较长,我们努力地图解每一个步骤,没有耐心的观众可以忽略前27步,直接看第28步最终结果.--------------------------------------------------------------- 1.在虚拟机主界

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

× 目录 [1]痛点 [2]解决 [3]基本用法[4]回调函数[5]注意事项 前面的话 this机制与函数调用有关,而作用域则与函数定义有关.有没有什么是可以将this机制和作用域联系起来的呢?本文将介绍ES6新增的内容——箭头函数 痛点 对于闭包的痛点在于,闭包的this默认绑定到window对象,但又常常需要访问嵌套函数的this,所以常常在嵌套函数中使用var that = this,然后在闭包中使用that替代this,使用作用域查找的方法来找到嵌套函数的this值 var a = 0;

程序员进阶路上不能错过的史上最全技术知识图谱秘籍

今天在技术大海中游啊游游啊游,哇啊哈哈 ^_^发现了一份非常有用的超级技术图谱诶! 强烈推荐啊!!本文原作者是易宝支付技术经理/架构师李艳鹏,这是鹏哥多年来积累和收集的技术知识技能图谱,有的是鹏哥原创总结的最佳实践,有的是小伙伴们的分享. 其实,每个秘籍图谱里面的内容都是互联网高并发架构师应该了解和掌握的知识.鹏哥索性就把这些图谱都收集在一起,并且进行了归类,便于大家查找和学习.图谱也暗含着他的一个小目标:想把更多的技术图谱和思维导图汇集在一起,成为互联网上“最全的技术图谱”. 这份技术知识图谱

程序员不能错过的技术知识图谱,进阶路上必备神器。

本文转载自李亚鹏 本文是鹏哥多年来积累和收集的技术知识技能图谱,有的是鹏哥原创总结的最佳实践,有的是小伙伴们的分享. 其实,每个秘籍图谱里面的内容都是互联网高并发架构师应该了解和掌握的知识.鹏哥索性就把这些图谱都收集在一起,并且进行了归类,便于大家查找和学习. 暂把标题定为:"史上最全的技术知识图谱秘籍",暗含着鹏哥的一个小目标:想把更多的技术图谱和思维导图汇集在一起,成为互联网上"最全的技术图谱". 这份技术知识图谱秘籍真的很棒,场主极力推荐分享给身边的技术人儿.

go语音之进阶篇显式调用panic函数

1.显式调用panic函数 示例: package main import "fmt" func testa() { fmt.Println("aaaaaaaaaaaaaaaaa") } func testb() { //fmt.Println("bbbbbbbbbbbbbbbbbbbb") //显式调用panic函数,导致程序中断 panic("this is a panic test") } func testc() {

8.17_Linux之bash shell脚本编程入门篇(三)之循环以及函数function的使用

bash shell脚本编程入门篇(三)之循环 什么是循环执行? 将某代码段重复运行多次 重复运行多少次: 循环次数事先已知 循环次数事先未知 有进入条件和退出条件 相关命令:for, while, until,selet, for命令的使用 作用: 依次将列表中的元素赋值给"变量名"; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束 命令格式: for 变量名 in 列表; do 循环体(正常执行的执行命令) 语句1 语句2 语句3 ... done 列表生成方式: (

Java语言程序设计(基础篇) 第四章 数学函数、字符和字符串

第四章 数学函数.字符和字符串 4.2 常用数学函数 方法分三类:三角函数方法(trigonometric method).指数函数方法(exponent method)和服务方法(service method) 4.4 String类型 String类型不是基本类型,而是引用类型(reference type).

Python基础篇【第五篇】:sed和函数

sed是一个无序且不重复的元素集合 1 class set(object): 2 """ 3 set() -> new empty set object 4 set(iterable) -> new set object 5 6 Build an unordered collection of unique elements. 7 """ 8 def add(self, *args, **kwargs): # real signatu