定义:箭头函数相当于匿名函数,并且简化了函数定义
如:x => x * x
1.箭头函数看上去是匿名函数的一种简写,但实际上,箭头函数和匿名函数有个明显的区别:箭头函数内部的 this 是词法作用域,由上下文确定。
2.箭头函数的 this 指向取决于外层作用域中的 this,外层作用域或函数的 this 指向谁,箭头函数中的 this 便指向谁
来源:https://www.liaoxuefeng.com/wiki/1022910821149312/1031549578462080
1.this 默认绑定:我们可以理解为函数调用时无任何调用前缀的情景,默认绑定时 this 指向全局对象(非严格模式)
2.隐式绑定:如果函数调用时,前面存在调用它的对象,那么 this 就会隐式绑定到这个对象上,如果函数调用前存在多个对象,this 指向距离调用自己最近的对象
3.显示绑定:通过 call 、apply 以及 bind 方法改变 this 的行为,相比隐式绑定,我们能清楚的感知 this 指向变化过程,如果在使用 call 之类的方法改变 this 指向时,指向参数提供的是 null 或者 undefined,那么 this 将指向全局对象
4.new 绑定:抽象理解为新对象就是 this
5.this 绑定优先级:显式绑定 > 隐式绑定 > 默认绑定,new 绑定 > 隐式绑定 > 默认绑定 ,不存在同时显示和 new 绑定同时生效的场景
1
libook 2021-08-12 11:03:53 +08:00
学习笔记嘛
“箭头函数相当于匿名函数”这个可能还需要深究一下。实际上箭头函数跟匿名函数没有直接联系,匿名函数只是函数无法被使用名称调用到的抽象概念,对于 JS 本身来说,并没有一个特别的概念叫“匿名函数”。 JS 是万物皆对象的设计理念,但并没有其他面向对象语言那么复杂的语法和特性,在相当长的时间里,JS 都是使用“原型”特性来实现对象特性的。所以 JS 的函数其实并不是纯粹的函数,而是兼任了类型的构造函数、方法的职责,被塞入了 this 等机制。 后来人们发现: 1. 经常需要在对象方法内部使用函数来减少代码的冗余,此时往往希望调用方法的 this 而不是函数自己的 this,那么函数的 this 就显得碍手了,你会经常见到在函数执行前有类似 that=this 这种写法,以确保在函数中使用 that 来调用到方法的 this 。 2. 对于大多函数式的程序设计来说,JS 函数的 function 关键字有些长(不像其他语言有 fn 或 func 这种简单写法),另外函数所集成的 this 等特性完全用不到。 3. 很多语言都有不可实例化的语法制约方案,使得一个预期不能被实例化的结构不接受被实例化,以避免一些 bug,JS 的函数因为同时也可以被用作构造函数,没有这种限制,使得一些 bug 不容易被发现。 箭头函数就是来解决上述问题的。 所以“箭头函数的 this 指向取决于外层作用域中的 this”这个也并不严谨,在我看来: 一方面箭头函数对待 this 的方式取决于它的“块结构( block )”,块结构存在于很多语法中,比如 if 、for 、while 、switch 、不用做方法的 funciton 、JSON 对象,或者纯粹为了隔离作用域而特意写的{},你可以理解为凡是两个大括号括起来的都是块结构(有例外的话请补充),可以理解箭头函数对待 this 跟 if 块内对待 this 是没有区别的; 另一方面箭头函数对待 this 跟对待任何一个名称是一样的,比如箭头函数外界有个变量 a,那么你就可以在箭头函数内访问这个变量 a,外界有个 this,自然也就能在箭头函数内调用到这个“this”,对于箭头函数本身是和变量 a 一样的存在。 想要理解 this 的特性,建议了解一下原型和原型链的特性,几乎是 JS 里面半数特性的根基。 |