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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (11)

我感兴趣的是,如果const在JavaScript中可以使用哪些类型的值(特别是函数)有任何限制。这有效吗?当然,它确实有效,但是出于任何原因它被认为是不好的做法?

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

是否应该在ES6中以这种方式定义所有功能?如果是这样的话,它似乎并没有被抓住。

提问于
用户回答回答于

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

函数声明,即:

function doSomething () {}

是完全悬挂在范围的顶部(let以及const它们也是块范围)。

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

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

一个函数表达式,即:

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

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

因此,范围内变量提升的通常规则 - 块范围变量(letconst)不会undefined在块范围的顶部提升。

意即:

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

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

如果你切换到使用var你的提升变量,但它将被初始化,undefined以便上面的代码块将仍然无法工作。(这将抛出一个TypeError,因为doSomething是不是你把它叫做时间的函数)

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

Axel Rauschmayer在范围和提升方面有很棒的职位,包括es6语义:ES6中的变量和范围界定

用户回答回答于

尽管用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 

扫码关注云+社区