箭头函数不仅仅是编写简洁代码的“捷径”。它还具有非常特殊且有用的特性。

JavaScript 充满了我们需要编写在其他地方执行的小函数的情况。

例如:arr.forEach(func) —— forEach 对每个数组元素都执行 func。

setTimeout(func) —— func 由内建调度器执行。

……还有更多。

JavaScript 的精髓在于创建一个函数并将其传递到某个地方。

在这样的函数中,我们通常不想离开当前上下文。这就是箭头函数的主战场啦。

箭头函数没有 “this”

正如我们在 对象方法,"this" 一章中所学到的,箭头函数没有 this。如果访问 this,则会从外部获取。

例如,我们可以使用它在对象方法内部进行迭代:

let group = {

title: "Our Group",

students: ["John", "Pete", "Alice"],

showList() {

this.students.forEach(

student => alert(this.title + ': ' + student)

);

}

};

group.showList();复制代码

这里 forEach 中使用了箭头函数,所以其中的 this.title 其实和外部方法 showList 的完全一样。那就是:group.title。

如果我们使用正常的函数,则会出现错误:

let group = {

title: "Our Group",

students: ["John", "Pete", "Alice"],

showList() {

this.students.forEach(function(student) {

// Error: Cannot read property 'title' of undefined

alert(this.title + ': ' + student)

});

}

};

group.showList();复制代码

报错是因为 forEach 运行它里面的这个函数,但是这个函数的 this 为默认值 this=undefined,因此就出现了尝试访问 undefined.title 的情况。

但箭头函数就没事,因为它们没有 this。

不能对箭头函数进行 new 操作

不具有 this 自然也就意味着另一个限制:箭头函数不能用作构造函数。不能用 new 调用它们。

箭头函数 VS bind

箭头函数 => 和使用 .bind(this) 调用的常规函数之间有细微的差别:.bind(this) 创建了一个该函数的“绑定版本”。

箭头函数 => 没有创建任何绑定。箭头函数只是没有 this。this 的查找与常规变量的搜索方式完全相同:在外部词法环境中查找。

箭头函数没有 “arguments”

箭头函数也没有 arguments 变量。

当我们需要使用当前的 this 和 arguments 转发一个调用时,这对装饰者(decorators)来说非常有用。

例如,defer(f, ms) 获得了一个函数,并返回一个包装器,该包装器将调用延迟 ms 毫秒:

function defer(f, ms) {

return function() {

setTimeout(() => f.apply(this, arguments), ms)

};

}

function sayHi(who) {

alert('Hello, ' + who);

}

let sayHiDeferred = defer(sayHi, 2000);

sayHiDeferred("John"); // 2 秒后显示:Hello, John复制代码

不用箭头函数的话,可以这么写:

function defer(f, ms) {

return function(...args) {

let ctx = this;

setTimeout(function() {

return f.apply(ctx, args);

}, ms);

};

}复制代码

在这里,我们必须创建额外的变量 args 和 ctx,以便 setTimeout 内部的函数可以获取它们。

总结

箭头函数:没有 this

没有 arguments

不能使用 new 进行调用

它们也没有 super,但目前我们还没有学到它。我们将在 类继承 一章中学习它。

这是因为,箭头函数是针对那些没有自己的“上下文”,但在当前上下文中起作用的短代码的。并且箭头函数确实在这种使用场景中大放异彩。

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[深入理解箭头函数]http://www.zyiz.net/tech/detail-120746.html

java有箭头函数吗_深入理解箭头函数相关推荐

  1. java jvm垃圾回收算法_深入理解JVM虚拟机2:JVM垃圾回收基本原理和算法

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 喜欢的话麻烦点下Star哈 文章将同步到我的个人博客: www.how ...

  2. python函数可以作为容器对象吗_正确理解Python函数是第一类对象

    正确理解 Python函数,能够帮助我们更好地理解 Python 装饰器.匿名函数(lambda).函数式编程等高阶技术. 函数(Function)作为程序语言中不可或缺的一部分,太稀松平常了.但函数 ...

  3. access month函数用法_掌握时间智能函数,同比环比各种比,轻松搞定!

    时间可以说是数据分析中最常用的独立变量,工作中也常常会遇到对时间数据的对比分析.假设要计算上年同期的销量,在PowerBI中可以用CALCULATE来写个度量值[上年同期], = CALCULATE( ...

  4. python中tracer函数意思_浅析Python编写函数装饰器

    本节主要介绍编写函数装饰器的相关内容. 跟踪调用 如下代码定义并应用一个函数装饰器,来统计对装饰的函数的调用次数,并且针对每一次调用打印跟踪信息. 这是一个通过类装饰的语法写成的装饰器,测试如下: 运 ...

  5. java中trim函数用法_深入理解jQuery.trim() 函数及trim()用法

    jQuery.trim() 函数及trim()用法详解 jQuery.trim()函数用于去除字符串两端的空白字符.该函数可以去除字符串开始和末尾两端的空白字符(直到遇到第一个非空白字符串为止).它会 ...

  6. java中io是什么_深入理解Java中的IO

    深入理解Java中的IO 转载自:http://blog.csdn.net/qq_25184739/article/details/51205186 本文的目录视图如下: Java IO概要 a.Ja ...

  7. java如果不使用多态_深入理解java多态没有烤山药的存在,java就不香了吗?

    @ 我不想知道各位理解java多态没有烤山药的存在,java香不香的问题了,我不要你们认为,我只要我觉得 (感觉要被打....) 在博主认为多态绝对是面向对象的第三大特性中让很多小白同学以及初学者难以 ...

  8. 深入java虚拟机 第四版_深入理解Java虚拟机-常用vm参数分析

    Java虚拟机深入理解系列全部文章更新中... https://blog.ouyangsihai.cn/shen-ru-li-jie-java-xu-ni-ji-java-nei-cun-qu-yu- ...

  9. java方法区内存泄露_深入理解java虚拟机-第二章:java内存区域与内存泄露异常...

    2.1概述: java将内存的管理(主要是回收工作),交由jvm管理,确实很省事,但是一点jvm因内存出现问题,排查起来将会很困难,为了能够成为独当一面的大牛呢,自然要了解vm是怎么去使用内存的. 2 ...

最新文章

  1. 小程序全局状态管理,在页面中获取globalData和使用globalSetData
  2. Swift3.0语言教程获取字符串编码与哈希地址
  3. pwa要离线html么,正确使用PWA
  4. adb打开packages_adb shell pm list packages的用法
  5. 美化“关于本机”中Logo、机型、CPU等信息详细教程
  6. 【ABAP】Field Symbol使用总结
  7. BIOS——[PXE-E61:Media test failure,check cable]解决方案
  8. DNS(域名系统)体系介绍
  9. CSS3动画@keyframes中translate和scale混用出错问题
  10. python第一周心得_python第一周心得-Go语言中文社区
  11. java atomiclong 使用_Java并发AtomicLongArray类
  12. 什么是 Stack Overflow,什么情况下会造成 Stack Overflow
  13. mysql 加入系统服务_添加Mysql到Windows系统服务
  14. pythonexcel模块哪个好_Python-Excel 模块哪家强?
  15. ZKTeco 中控考勤机M300 plus java开发步骤 使用jacob 调用中控考勤机dll(详细配置)
  16. haskell学习笔记(7)-高阶函数Curried functions
  17. 运维的升级打怪之路v2版
  18. Flutter笔记--Sliver用法
  19. Progressive LayeredExtraction(PLE):ANovelMulti-Task Learning(MTL)ModelforPersonalizedRecommendations
  20. 数据中台初探与应用实践,28页ppt详解

热门文章

  1. Python独立运行环境
  2. LeetCode 454. 四数相加 II【哈希表】
  3. JavaScript switch语句和循环
  4. vue项目中实现用户登录以及token验证
  5. 绘画遇到瓶颈期怎么办?拒绝正面刚跨过瓶颈期
  6. 配置miniconda
  7. asp.net iframe html,ASP.NET中使用IFRAME建立类Modal窗口
  8. 金融行业云迁移实践 HyperMotion助力江苏农信银行实施金融专有云创新项目,实现跨地域,多网点,大数据量迁移上云
  9. ${pageContext.request.contextPath}失效问题
  10. POJ 1507 Commedia dell' arte 未完成