正确使用const来定义JavaScript中的函数

我感兴趣的是,如果在JavaScript中使用const可以设置什么types的值有任何限制 – 特别是函数。 这有效吗? 授予它的工作,但是它被认为是不好的做法,因为任何原因?

 const doSomething = () => { ... } 

是否所有的function都应该在ES6中这样定义? 如果是这样的话,似乎并不是这样。

感谢您的任何意见!

你所做的事情没有问题,但你必须记住函数声明和函数expression式之间的区别。

函数声明,即:

 function doSomething () {} 

被完全悬挂在范围的顶部(和letconst一样,它们也是块范围的)。

这意味着以下将起作用:

 doSomething() // works! function doSomething() {} 

一个函数expression式,即:

 [const | let | var] = function () {} (or () => 

是创build一个匿名函数( function () {} )并创build一个variables,然后将该匿名函数赋值给该variables。

所以关于作用域范围variables( letconst )中的variables提升的通常规则不会像块范围的顶部一样提升。

意即:

 if (true) { doSomething() // will fail const doSomething = function () {} } 

由于doSomething没有定义,所以会失败。 (它会抛出一个ReferenceError

如果你切换到使用var你得到你的提升variables,但它将被初始化为undefined以便上面的代码块将仍然无法正常工作。 (这会抛出一个TypeError因为doSomething在你调用的时候不是函数)

至于标准的做法,你应该总是使用适当的工具来完成这项工作。

Axel Rauschmayer在范围和提升方面有很好的职位,包括es6语义: ES6中的variables和范围

尽pipe使用const来定义函数似乎是一种破解,但是它带来了一些很好的优势,使得它更好(在我看来)

  1. 它使函数不可变,所以你不必担心这个函数被其他代码所改变。

  2. 您可以使用胖箭头语法,这是更短,更干净。

  3. 使用箭头function为您处理this绑定。

function例子

 // define a function function add(x, y) { return x + y; } // use it console.log(add(1, 2)); // 3 // oops, someone mutated your function add = function (x, y) { return x - y; }; // now this is not what you expected console.log(add(1, 2)); // -1 

使用const有一些非常重要的好处,有些人会说它应该尽可能地使用,因为它是多么刻意和指示性的。

据我所知,它是Javascript中最具指示性和可预测的variables声明,也是最有用的一个variables,因为它是如何受到限制的。 为什么? 因为它消除了var的一些可能性,并让声明。

当你阅读“const”时,你能推断出什么? 只要阅读const声明语句,就可以知道以下所有内容,而不扫描对该variables的其他引用:该值绑定到该variables(尽pipe其基础对象不是深不可变的)。 它不能在其立即包含的块之外访问; 并且由于时域死区规则(TDZ),在声明之前从不访问绑定。

从一篇争论let和const的好处的文章,它也更直接地回答你关于关键字约束/限制的问题:

“let和const提供的约束是使代码更容易理解的一种强有力的方法,尽量在你编写的代码中增加这些约束,更多的声明性约束限制了一段代码的意思对于人类来说,阅读,parsing和理解将来的一段代码越简单,越快。

当然,对于一个const声明比对一个var声明有更多的规则:block-scoped,TDZ,在声明时赋值,不重新赋值。 而var语句只是函数范围的信号。 但是,规则计数并不能提供很多见解。 从复杂性的angular度衡量这些规则更好:规则是增加还是减less复杂性? 在const的情况下,块范围意味着范围比函数范围更窄,TDZ意味着我们不需要从声明中向后扫描范围以便在声明之前查找用法,并且分配规则意味着绑定将始终保留相同的参考。

更严格的陈述是,一段代码变得越简单。 当我们为语句的含义添加约束时,代码变得不可预测。 这是静态types程序比dynamictypes更容易阅读的最大原因之一。 静态键入对程序编写者有很大的限制,但是它也对程序的解释有很大的限制,使得代码更容易理解。

考虑到这些论点,build议您尽可能使用const,因为这是使我们思考最less的可能性的陈述。“

来源: https : //ponyfoo.com/articles/var-let-const

这样做非常丑陋,但它确实是有效的。

在我工作的地方,我devise了一个简单的工厂类,它接受一个parent对象和一个函数数组,然后通过使用defineProperty getter将这些函数暴露给父defineProperty

它具有相同的效果:一个函数在被定义之后不能被改变,但是在我看来它看起来更干净。

最重要的是在你的项目中保持一致。 收集你的团队成员,并就如何做到这一点明确达成一致。

还有一个情况是常量函数可能有用。 如果你的代码中有很多常量,并且需要一个专门处理这些常量的函数,那么把这个函数本身变成一个常量是个好主意:

 const FLAG_ONE = 1; const FLAG_TWO = 2; const FLAG_THREE = 4; // etc. // resolves flag into string for debugging purposes: const FLAG_NAME = flag => { switch ( flag ) { case FLAG_ONE: return 'one'; // etc. } }; 

没有必要以任何方式将FLAG_NAME定义为一个常量,但它会提高代码的易读性。

斯蒂芬Bijzitter说
©这样做很丑陋

 const foo = (a, _foo, b) => _foo(a, a, b) const bar = (a, b, c) => (c - 1) ? bar((a * b), b, (c - 1)) : a alert( foo(3, bar, 4) )