当前位置: 首页 > 知识库问答 >
问题:

正确使用常量定义函数

干永丰
2023-03-14

在JavaScript中使用const可以设置什么类型的值,特别是函数,有没有限制?这有效吗?虽然它确实有效,但出于任何原因,它被认为是不好的做法吗?

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

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

共有3个答案

云和惬
2023-03-14

自从有人问这个问题以来已经三年了,但我刚刚遇到它。由于这个答案已经很清楚了,请允许我重复一下:

问:我很感兴趣,在JavaScript中使用const可以设置哪些类型的值-特别是函数。这有效吗?当然它确实有效,但它是否出于任何原因被认为是不好的做法?

在观察了一位多产的JavaScript程序员之后,我有了做一些研究的动机,他总是使用const语句来实现函数,即使没有明显的原因/好处。

在回答“出于任何原因它被认为是不好的做法吗?”让我说,IMO,是的,或者至少,使用函数语句有好处。

在我看来,这在很大程度上是一个偏好和风格的问题。上面提出了一些很好的论点,但没有一个能像本文中所做的那样清楚:不断的困惑:为什么我仍然按媒体使用JavaScript函数语句。freecodecamp。org/billsourour,JavaScript大师,顾问和老师。

我敦促每个人都阅读那篇文章,即使你已经做出了决定。

以下是要点:

理想情况下,我希望或多或少地按照预期的执行顺序声明代码。

对我来说,这就是showstupper:在执行到达之前,使用const关键字声明的任何值都是不可访问的。

我上面所描述的迫使我们编写看起来颠倒的代码。我们必须从最低级别的函数开始并向上工作。

我的大脑不是那样工作的。我想先了解背景再了解细节。

大多数代码是由人类编写的。因此,大多数人的理解顺序大致遵循大多数代码的执行顺序是有道理的。

万嘉石
2023-03-14

虽然使用const定义函数看起来像是一种黑客行为,但它有一些巨大的优势,使其更优越(在我看来)

>

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

    可以使用较短的胖箭头语法

    使用箭头函数可以为您处理此绑定。

    带有功能的示例

    // 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

  • 陈富
    2023-03-14

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

    函数声明,即:

    function doSomething () {}
    

    被完全提升到作用域的顶部(就像let和const一样,它们也是块作用域)。

    这意味着以下方法将起作用:

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

    函数表达式,即:

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

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

    因此,关于范围内变量提升的通常规则——块范围变量(let和const)不会随着未定义的变量提升到其块范围的顶部。

    这意味着:

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

    将失败,因为未定义剂量测量。(它将抛出一个参考错误)

    如果您切换到使用var,您可以提升变量,但它将被初始化为未定义,因此上面的代码块仍然不起作用。(这将引发类型错误,因为在调用时,doSomething不是函数)

    就标准实践而言,您应该始终使用适合该工作的适当工具。

    Axel Rauschmayer发表了一篇关于范围和提升的文章,包括es6语义:es6中的变量和范围

     类似资料:
    • 问题内容: 我想使用变量来动态命名一些函数,如下所示: 我知道我可以使用这样的变量来 调用 函数: 但是最重​​要的例子对我不起作用。 有任何想法吗? 我正在使用具有模块的系统。每个模块都是单个php脚本,可以从特定文件夹中添加或删除。 每个模块都需要一个新功能来对其进行初始化。我正在寻找文件名,然后想循环并创建一系列功能,每个模块一个。 我使用的是现有系统,无法重写模块处理。 替代方法是只写出所

    • 我正在使用Xamarin和MVVMCross开发一个应用程序,在创建绑定NSLayoutConstraints常量时遇到问题。 我有一个带有子视图的视图,如果某个列表 为此,我向该视图添加了一个NSLayoutConstraint,以便能够以编程方式修改其高度,并使用以下代码行对其进行绑定: CountToConstraintHeightConverter非常简单,它只检查值是否等于0以返回0或默

    • 1.【强制】 不允许任何魔法值(即未经定义的常量)直接出现在代码中。 反例: String key = "Id#taobao_" + tradeId; cache.put(key, value); 2.【强制】 long 或者 Long 初始赋值时,必须使用大写的 L,不能是小写的 l,小写容易跟数字 1 混淆,造成误解。 说明: Long a = 2l; 写的是数字的 21,还是 Long 型的

    • 我在packagist.org上有一个PHP库,它使用一些常量,随着项目的不同而变化。 我尝试使用这样的常量: > 常量存储在composer libriary的conf.php中 在作曲家init用户名/mylib命令之后,我从 /vendor/username/mylib/conf.php复制到本地/conf.php并将其用于当前项目配置 对于project1,在/conf.php中 proj

    • 我想对自定义JFX组件进行子类化,以更改/扩展它们的行为。作为一个真实的例子,我想扩展一个具有编辑功能的data viewer组件。 考虑下面非常小的场景。使用类非常有效。但是当实例化子类(在FXML文件中)时,不再注入字段 会自动调用该方法。 我知道将超级组件嵌套在子组件中应该可以很好地工作,但是我仍然想知道使用继承是否可以做到这一点。 将的可见性扩大到显然无法解决此问题。在中结合定义扩展点(此

    • 在Angular 1. x中,您可以这样定义常量: Angular(使用TypeScript)中的等价物是什么? 我只是不想在我的所有服务中一遍又一遍地重复API基url。