为什么要使用`const foo =()=> {}`而不是`function foo(){}`


12

例如,在此Redux视频中,讲师始终使用以下语法

const counter = (state=0, action) => {
   ... function body here
}

我只用“传统”

function counter(state=0, action) {
   ... function body here
}

实际上,这更短,而且更清晰。在页面的相当平坦且结构化的左侧边缘搜索单词“ function”要比在参差不齐的右侧边缘扫描一个小的“ =>”要容易。

除了之外this,尝试成为客观的而非观点,新语法有没有有用的区别或优势?


3
:StackOverflow上这个问题您可能会感兴趣stackoverflow.com/questions/34361379/...
文森特Savard

3
我不是JavaScript专家,但是我想const可以确保以后不再对函数进行重新定义。
MetaFight

感谢@VincentSavard,这很完美,基本上是我所期望的:除了“ this”和原型/类之外,似乎没有真正的区别。
user949300 '18

3
@ user949300有有差别,一个MetaFight提到。同样,原型/“这些东西”也迅速成为关键的区别。
msanford

1
长话短说:您应该重视简明扼要的优势。
韦恩·布鲁斯

Answers:


11

函数语句(命名为函数,显示了第二种语法)被提升到整个词法范围的顶部,甚至那些位于任意和控制块之后的if语句也是如此。使用const(如let)声明变量将赋予其块作用域,停止完整的起重(起重到单纯的块状),并确保无法重新声明它。

当将脚本串联在一起或使用其他软件包构建工具将脚本串联在一起时,函数提升会以难以调试的方式破坏冲突的脚本,因为它会以静默方式失败。重新声明const将在程序运行之前引发异常,因此调试起来容易得多。


谢谢。好答案。我主要工作在较小的JS项目或node.js服务器项目上,这些项目具有良好的命名空间模块系统。只是从一个使用捆绑程序的客户端项目开始,这是一个很好的见解。
user949300 '18

2
仅注意eslint no-func-assign可能会遇到此重新声明问题。
user949300 '18

2
为了获得静态类型语言的好处,编写具有混淆信号的代码是使用Typescript而不是的原因constconst出于这个原因,IMO 在eslint,webpack,babel等时代开始在任何地方使用都是有点短视的。至少十年来,没有人再手动将文件串联在一起。
韦恩·布鲁斯

2

这就是为什么您应该使用function

  1. 信号清晰明了。这比其他答案中列出的任何边缘案例提升问题要有益得多。

  2. 实际上,您想在模块中进行吊装,因为从下面的代码中可以看到consttryDoTheThingfail 的声明会以静默方式出现,并且在您尝试调用它之前不会被捕获。

  3. 我接触的大多数初级用户都开始const声明每个函数,因为它现在很流行,例如在制表符上使用空格或functional!!!由于“ OOP不好”而做了所有事情。不要那样做 您不想成为那种在不完全理解其含义的情况下追随时尚的人。

通过https://gist.github.com/stephenjfox/fec4c72c7f6ae254f31407295dc72074


/*
This shows that, because of block-scoping, const function references must be
invoked in-order or else things will fail silently.
const's are added the name space serially (in the order in which they appear)
and much of the body isn't declared when we first try to invoke or functions
*/


const tryDoTheThing = () => {
  console.log(`This is me trying to be awesome ${getAwesome()}`)
}


// "getAwesome is not defined", because it is referenced too early
tryDoTheThing() // comment to see the rest work


const getAwesome = () => (+((Math.random() * 10000).toString().split('.')[0]))


const doTheThing = () => {
  console.log(`This is awesome! ${getAwesome()}`)
}

doTheThing() // prints

/*
Function declarations are given two passes, where the first lifts them to
the top of the namespace, allowing "out of order" usage
*/

doTheThing();


function doTheThing() {
  console.log(`This is awesome number ${getAwesome()}`)
}

function getAwesome() {
  return (+((Math.random() * 10000).toString().split('.')[0]))
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.