[OHIF-Viewers]医疗数字阅片-医学影像-中间插播一下-es6-使用const加箭头函数声明函数相对于function声明函数有什么好处?

这个好多人都已经写过了,这里插播一下,在OHIF-Viewers里面有很多这样的写法,当然OHIF-Viewers维护者众多,有人用这种新的写法也有原始的写法,各种历史遗留的写法问题。

这是ES6中的东东,SO要搞REACT相关项目得先打好ES6基础。

OHIF-Viewers项目,跟着博主此系列博文也可加快学习OHIF-Viewers的进度。

此前也写了一篇[OHIF-Viewers]医疗数字阅片-医学影像-ES6箭头函数(=>)

ES6中,除了let和const新特性,箭头函数是使用频率最高的新特性了。如果你曾经了解如日中天的JavaScript衍生语言CoffeeScript, 就会清楚此特性并非ES6独创。箭头函数顾名思义是使用箭头(=>)定义的函数,属于匿名函数一类。

今天的文章内容将会从以下几个方面,介绍箭头函数:

  • 使用语法
  • this穿透
  • 箭头函数和传统函数的区别

使用语法

箭头函数有四种使用语法

1、单一参数的单行箭头函数

如下段代码所示,很简单:

const fn= foo =>`${foo} world`;

这是箭头函数最简洁的形式,常用于用作简单的处理函数,如过滤。如下段代码所示:

let array=['a','bc','def','ghij']; array=array.filter(item=>item.length>=2);

2、多参数的单行箭头函数 语法也很简单,如下段代码所示:

const fn=(foo,bar) => foo+bar

在实际开发中,函数的参数不会只有一个,在箭头函数中,多参数的语法跟普通函数一样,用括号包裹参数项。我们经常处理函数,如排序,示例代码如下:

let array=['a','bc','def','ghij']; array=array.sort((a,b) => a.length < b.length);

3、多行箭头函数 单一参数,如下段代码所示:

foo => {return `${foo} world`;
}

多参数,如下段代码所示:

(foo,bar) => {return foo+bar;
}

4、无参数箭头函数

如果一个箭头函数无参数传入,则需要用一对空的括号来表示空的参数列表。

const greet = () => 'Hello World'

以上都是被支持的箭头函数的表达方式,其最大的好处就是简单明了,省略了function关键字,而使用 => 代替。相对于传统的function函数,箭头函数在简单的函数使用中更为简洁直观。

书写箭头的函数过程中,我们应该注意以下几点:

1、使用单行箭头函数时,应避免换行

错误的用法,如下段代码所示:

const fn=x
=> x*2 //SyntaxError

正确的写法,如下:

const fn= x => x*2 //ok

2、参数列别的右括弧、箭头应在一行

错误的用法,如下段代码所示:

const fn = (x,y) //SyntaxError
=> {return x*y;
}

下段代码书写是正确的:

const fn= (x,y) => { //okreturn x*y } const fn= (x, y) => { //ok return x*y }

3、单行箭头函数返回只能包含一条语句

错误的书写,如下段代码所示:

const fn1= x => x=x*2; return x+2; //SyntaxError

正确的书写,如下段代码所示:

const fn2= x => {x=x*2;return x+2; } //ok

4、如果单行箭头返回一个对象,请用圆括号包裹

错误的书写,如下段代码所示,解析引擎会将其解析成一个多行箭头函数:

const ids=[1,2,3];
const users=ids.map(id=>{id:id}); //wrong:[ undefined, undefined, undefined ]

正确的书写,如下段代码所示:

const ids=[1,2,3];
const users=ids.map(id=>({id:id})); //Correct:[ { id: 1 }, { id: 2 }, { id: 3 } ]

箭头函数十分简洁,特别适合单行回调函数的定义,比如我们有以下需求:

我们有一个这样的名字数组names,['Will','Jack','Peter','Steve','John','Hugo','Mike'],输出序号为偶数的名字[ 'Will', 'Peter', 'John', 'Mike' ],我们如何使用箭头函数在一行语句完成呢,如下段代码所示:

const names=['Will','Jack','Peter','Steve','John','Hugo','Mike']; const newSet=names .map((name,index)=>({ id:index, name:name })) .filter(man => man.id %2 ==0) .map(man => [man.name]) .reduce((a,b) => a.concat(b))

this穿透

事实上,箭头函数不仅书写简洁,还有一个神奇的功能,就是将函数内部的this延伸上一层作用域中,及上一层的上下文会穿透到内层的箭头函数中,让我们先看一段实际的例子,如下段所示:

var Widget={// Ainit:function () { // B document.addEventListener("click", function (event){ //C this.doSomething(event.type); }, false); }, doSomething:function (type) { console.log("Handling"+ type+"event"); } }; Widget.init();

这段代码会如何输出呢,想必大家都猜到了吧,输出undefined,为什么呢?我们在B位置内声明了函数(C区域),this关键词的指向B区域的函数,由于B区域内没有doSomething函数声明,因此输出undefined,ES6之前我们如何修正此问题呢?

我们可以使用bind方法改变this指向A区域Widget对象,示例代码如下:

var Widget={// Ainit:function () { // B document.addEventListener("click", (function (event) { //C this.doSomething(event.type); }).bind(this), false); }, doSomething:function (type) { console.log("Handling"+ type+"event"); } }; Widget.init();

下面这种方法是我们最常用的方法,我们在B区域声明了that变量,并将其this赋值,确保c区域this的指向至Widget对象:

var Widget={// Ainit:function () { // B var that=this; document.addEventListener("click", function (event) { //C that.doSomething(event.type); console.log(that); }, false); }, doSomething:function (type) { console.log("Handling"+ type+"event"); } }; Widget.init();

有了箭头函数,我们可以使用箭头函数的this穿透功能,将this的作用域延伸至上一层B区域函数,如下段代码所示:

var Widget={
//Ainit:function () { //B document.addEventListener("click", (event) => { //C this.doSomething(event.type); }, false); }, doSomething:function (type) { console.log("Handling"+ type+"event"); } }; Widget.init();

箭头函数是不是更简单,代码更清晰呢。

还有一个情况需要注意,箭头函数对上下文的绑定是强制的,无法通过call或aplly进行改变,如下段代码所示:

function widget() {this.id=123; this.log=()=>{ console.log(this) console.log('widget log',this.id); } } var pseudoWidget={ id:456 }; new widget().log.call(pseudoWidget);//123

上述代码会如何输出呢,由于箭头函数对上下文的绑定是强制的,因此this指向不会指向pseudoWidget对象,因此输出123。

箭头函数和传统函数的区别

1、箭头函数作为匿名函数,是不能作为构造函数的,不能使用new

如下段代码所示,我们使用new方法,会提示如下信息:

const B =()=>({wechat:"前端达人"}); let b = new B(); //TypeError: B is not a constructor

2、箭头函数不绑定arguments,可以使用剩余参数(rest)解决

function A(a){console.log(arguments); //[object Arguments] {0: 1} } var B = (b)=>{ console.log(arguments); //ReferenceError: arguments is not defined } var C = (...c)=>{ //...c即为rest参数 console.log(c); //[3] } A(1); B(2); C(3);

3、箭头函数this指向具备穿透特性,会捕获其所在上下文的this值

4、箭头函数没有原型属性

var a = ()=>{return '前端达人'; } function b(){ return '前端达人'; } console.log(a.prototype);//undefined console.log(b.prototype);//object{...}

5、箭头函数不能当做Generator函数,不能使用yield关键字

6、箭头函数对上下文的绑定是强制的,无法通过call或aplly进行改变

小节

今天的内容就介绍到这里,我们可以看出使用箭头函能减少代码量,更加简介易读。在使用箭头函数时,我们一定要理解箭头函数和传统函数的区别,如果函数功能简单,只是简单的逻辑处理,尽量使用箭头函数。

const 有什么好处?

  • 不被覆盖,被重写会报错,而函数声明会安静被覆盖

函数表达式与函数声明的对比?

  • 前者需先前面写好,明确往代码前面找定义即可,后者可前可后,更灵活
  • 前者可放块Block语句中,搭配更丰富,后者不行

同是函数表达式?

  • 相比function, 箭头函数更简洁,并自带return,单个函数最多时节省14个字符(见回复2,function+return+{} vs =>
  • 箭头函数常用于函数式编程/闭包场景,特别是频繁在数组map、filter、reduce等中的使用
  • 箭头函数更易读,更为主流,浏览器会往这方向优化

参考链接:

https://juejin.im/post/5c7bef126fb9a049c043c077

https://cnodejs.org/topic/5b95e6f74cdb88f72f5a920a

[OHIF-Viewers]医疗数字阅片-医学影像-中间插播一下-es6-使用const加箭头函数声明函数相对于function声明函数有什么好处?...相关推荐

  1. [OHIF-Viewers]医疗数字阅片-医学影像-Module: Panel-自定义面板-中二-Reduxreact-redux状态管理详解...

    [OHIF-Viewers]医疗数字阅片-医学影像-Module: Panel-自定义面板-中二-Redux&react-redux状态管理详解 先上官方文档,推荐阅读英文原版文档,是最新.最 ...

  2. [OHIF-Viewers]医疗数字阅片-医学影像-事件总线管理器

    [OHIF-Viewers]医疗数字阅片-医学影像-事件总线管理器 添加按钮>调用命令>注册回调函数 App.js import React, { Component } from 're ...

  3. [OHIF-Viewers]医疗数字阅片-医学影像-cornerstone-core-Cornerstone.js提供了一个完整的基于Web的医学成像平台。...

    [OHIF-Viewers]医疗数字阅片-医学影像-cornerstone-core-Cornerstone.js提供了一个完整的基于Web的医学成像平台. 还必须写中文,不然不让同步,蛋疼呀--- ...

  4. [OHIF-Viewers]医疗数字阅片-医学影像-es6解构赋值-const{}=-let{}=

    [OHIF-Viewers]医疗数字阅片-医学影像-es6解构赋值-const{}=-let{}= 解构赋值语法是一种 Javascript 表达式.通过解构赋值, 可以将属性/值从对象/数组中取出, ...

  5. [OHIF-Viewers]医疗数字阅片-医学影像-es6-Element.querySelector()

    [OHIF-Viewers]医疗数字阅片-医学影像-es6-Element.querySelector() https://developer.mozilla.org/zh-CN/docs/Web/A ...

  6. [OHIF-Viewers]医疗数字阅片-医学影像-数字胶片直接下载,不再弹窗进行设置

    [OHIF-Viewers]医疗数字阅片-医学影像-数字胶片直接下载,不再弹窗进行设置 直接下载解决方案 \Viewers\extensions\cornerstone\src\commandsMod ...

  7. [OHIF-Viewers]医疗数字阅片-医学影像-querySelector() 选择器语法-将画布(canvas)图像保存成本地图片的方法...

    [OHIF-Viewers]医疗数字阅片-医学影像-querySelector() 选择器语法-将画布(canvas)图像保存成本地图片的方法 将画布(canvas)图像保存成本地图片的方法 使用HT ...

  8. [OHIF-Viewers]医疗数字阅片-医学影像-使用 PropTypes 进行类型检查

    [OHIF-Viewers]医疗数字阅片-医学影像-使用 PropTypes 进行类型检查 注意: 自 React v15.5 起,React.PropTypes 已移入另一个包中.请使用 prop- ...

  9. [OHIF-Viewers]医疗数字阅片-医学影像-REACT-Hook API索引

    [OHIF-Viewers]医疗数字阅片-医学影像-REACT-Hook API索引 Hook 是 React 16.8 的新增特性.它可以让你在不编写 class 的情况下使用 state 以及其他 ...

最新文章

  1. myeclipse新建或者另存为新jsp无法打开
  2. redis主从复制如何保证数据一致性_面试官:Redis 主从复制时网络开小差了怎么整?...
  3. Java中MessageFormat的使用
  4. tensorflow-Inception-v3模型训练自己的数据代码示例
  5. 动态修改属性设置 easyUI
  6. linux内存管理_浅谈Linux内存管理
  7. less webpack 热更新_webpack---less+热更新 使用
  8. linux 终端必须退出 history才会记录吗,Linux随笔 - linux 多个会话同时执行命令后history记录不全的解决方案【转载】...
  9. devops的五个要素_DevOps诗歌大满贯:DevOps艺术的五首诗
  10. 如何做好软件测试管理工作,如何才能做好软件测试工作
  11. golang中值类型/指针类型的变量区别总结
  12. [WPF]c#调用默认浏览器打开网址
  13. 基于麻雀搜索算法优化的广义回归神经网络(GRNN)预测 -附代码
  14. 注册会计师的待遇如何?职业发展怎么样?
  15. 软回车和硬回车 MS高级office
  16. 彼得林奇的成功投资---学习之一
  17. DaoCloud道客:云原生多云应用利器–Karmada总览篇
  18. ADI Blackfin DSP处理器-BF533的开发详解60:DSP控制ADXL345三轴加速度传感器-电子水平仪(含源码)
  19. int正数和负数的原码、反码、补码
  20. ppt里插入python(code)代码高亮

热门文章

  1. sigmoid函数sigmoid求导
  2. 多道批处理操作系统和分时操作系统的概念
  3. Olist巴西电商数据分析(二)
  4. 嘴上老喊辞职的人总也不走,如何看待这种现象?
  5. html中常用判断和工具(二)
  6. 无法加载文件 C:\Users\haoqi\Documents\WindowsPowerShell\profile.ps1,因为在此系统上禁止运行脚本
  7. 计算机编程英语单词多少,计算机编程常用英语单词
  8. Linux搭建samba服务及使用案例
  9. 06蚂蚁-高性能Nginx服务器——1.反向代理
  10. 相机标定与棋盘格标定