正确使用 const 来定义函数

对于在 JavaScript 中使用哪些类型的值,特别是函数,可以设置哪些类型的值是否有任何限制?这有效吗?当然它确实有效,但它是否因任何原因被认为是不良做法?const

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

在ES6中,所有函数都应该以这种方式定义吗?如果是这样的话,这似乎并没有流行起来。


答案 1

您所做的工作没有问题,但您必须记住函数声明和函数表达式之间的区别。

函数声明,即:

function doSomething () {}

完全吊到范围的顶部(并且喜欢,它们也是块范围的)。letconst

这意味着以下内容将起作用:

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

函数表达式,即:

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

创建匿名函数 () 和创建变量,然后将该匿名函数赋值给该变量。function () {}

因此,关于在作用域内进行变量提升的通常规则 - 块范围的变量(和)不会上升到其块范围的顶部。letconstundefined

这意味着:

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

将失败,因为 未定义。(它会抛出一个doSomethingReferenceError)

如果您切换到使用,则可以提升变量,但它将被初始化为,以便上面的代码块仍然不起作用。(这将抛出一个因为在您调用它时不是函数)varundefinedTypeErrordoSomething

就标准做法而言,您应该始终使用适当的工具来完成这项工作。

Axel Rauschmayer在范围和提升方面发表了一篇很棒的文章,包括es6语义:ES6中的变量和范围


答案 2

尽管用于定义函数似乎是一种黑客攻击,但它具有一些巨大的优势,使其更优越(在我看来)const

  1. 它使函数不可变,因此您不必担心该函数被其他一些代码更改。

  2. 你可以使用胖箭头语法,它更短,更干净。

  3. 使用箭头函数可以为您处理绑定问题。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

// define a function (wow! that is 8 chars shorter)
const add = (x, y) => x + y;

// use it
console.log(add(1, 2)); // 3

// someone tries to mutate the function
add = (x, y) => x - y; // Uncaught TypeError: Assignment to constant variable.
// the intruder fails and your function remains unchanged