js this 绑定和箭头函数定义

2021-08-11 17:29:37 +08:00
 MaoRong

箭头函数

定义:箭头函数相当于匿名函数,并且简化了函数定义

如:x => x * x

1.箭头函数看上去是匿名函数的一种简写,但实际上,箭头函数和匿名函数有个明显的区别:箭头函数内部的 this 是词法作用域,由上下文确定。

2.箭头函数的 this 指向取决于外层作用域中的 this,外层作用域或函数的 this 指向谁,箭头函数中的 this 便指向谁

来源:https://www.liaoxuefeng.com/wiki/1022910821149312/1031549578462080

this 绑定

1.this 默认绑定:我们可以理解为函数调用时无任何调用前缀的情景,默认绑定时 this 指向全局对象(非严格模式)

2.隐式绑定:如果函数调用时,前面存在调用它的对象,那么 this 就会隐式绑定到这个对象上,如果函数调用前存在多个对象,this 指向距离调用自己最近的对象

3.显示绑定:通过 call 、apply 以及 bind 方法改变 this 的行为,相比隐式绑定,我们能清楚的感知 this 指向变化过程,如果在使用 call 之类的方法改变 this 指向时,指向参数提供的是 null 或者 undefined,那么 this 将指向全局对象

4.new 绑定:抽象理解为新对象就是 this

5.this 绑定优先级:显式绑定 > 隐式绑定 > 默认绑定,new 绑定 > 隐式绑定 > 默认绑定 ,不存在同时显示和 new 绑定同时生效的场景

来源:https://www.cnblogs.com/echolun/p/11962610.html

1499 次点击
所在节点    JavaScript
2 条回复
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 里面半数特性的根基。
MaoRong
2021-08-16 14:53:12 +08:00
@libook 多谢,学习了!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/795138

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX