在JavaScript中使用const可以设置什么类型的值,特别是函数,有没有限制?这有效吗?虽然它确实有效,但出于任何原因,它被认为是不好的做法吗?
const doSomething = () => {
...
}
在ES6中,所有函数都应该这样定义吗?如果是这样,这似乎并没有流行起来。
自从有人问这个问题以来已经三年了,但我刚刚遇到它。由于这个答案已经很清楚了,请允许我重复一下:
问:我很感兴趣,在JavaScript中使用const可以设置哪些类型的值-特别是函数。这有效吗?当然它确实有效,但它是否出于任何原因被认为是不好的做法?
在观察了一位多产的JavaScript程序员之后,我有了做一些研究的动机,他总是使用const语句来实现函数,即使没有明显的原因/好处。
在回答“出于任何原因它被认为是不好的做法吗?”让我说,IMO,是的,或者至少,使用函数
语句有好处。
在我看来,这在很大程度上是一个偏好和风格的问题。上面提出了一些很好的论点,但没有一个能像本文中所做的那样清楚:不断的困惑:为什么我仍然按媒体使用JavaScript函数语句。freecodecamp。org/billsourour,JavaScript大师,顾问和老师。
我敦促每个人都阅读那篇文章,即使你已经做出了决定。
以下是要点:
理想情况下,我希望或多或少地按照预期的执行顺序声明代码。
对我来说,这就是showstupper:在执行到达之前,使用const关键字声明的任何值都是不可访问的。
我上面所描述的迫使我们编写看起来颠倒的代码。我们必须从最低级别的函数开始并向上工作。
我的大脑不是那样工作的。我想先了解背景再了解细节。
大多数代码是由人类编写的。因此,大多数人的理解顺序大致遵循大多数代码的执行顺序是有道理的。
虽然使用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
您所做的没有问题,但您必须记住函数声明和函数表达式之间的区别。
函数声明,即:
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。