在 JavaScript for 循环中重新分配常量有什么好处?

What are the advantages of reassigning constants inside of JavaScript for loops?

类似于,在js循环中使用const而不是letvar对于每次迭代都会改变的值有什么好处?

我不是这种模式的特别粉丝,但我有兴趣了解这种模式的优点。

背景

当我在 Visual Studio 中写入 JavaScript 并键入 for 时,它会提示以下代码块:

for (let index = 0; index < array.length; index++) {
    const element = array[index];
                    
}

我个人不喜欢这种模式,因为每次迭代都将值重新分配给 const,因为它似乎违反了常量的核心思想(是的,我知道常量在技术上超出了范围, 但它仍然感觉 const 正在被分配一个新值)。

我假设必须有很多理由支持这种模式,否则为什么它会作为建议的代码块保留下来。我想出了一个很好的理由,但我仍然很好奇我缺少什么优势。

我想到的原因

我认为这在大型代码块中很有用,您需要确保没有人使用此名称,或者此名称被多次引用并期望相同的值。

如果您不满意

for (let index = 0; index < array.length; index++) {
    const element = array[index];
}

那么您可能对 const 大多数 用途不满意,就像大多数函数中的用途一样,因为值经常变化。

function getFullName(first, last) {
  const fullName = first + ' ' + last;
  return fullName;
}

const 的目的是表明 那个特定的变量绑定,在它所在的范围内,永远不会被重新分配。 就是这样。 在您的循环中,每次迭代都会创建一个新的变量环境,并且在每个这样的环境中,都会创建一个 const。在这里使用 let 不会让事情变得更清楚 - 相反,使用 let 只是因为你在循环内(或在函数内,就像我上面的例子)通常表示误解范围。

const 不是什么意思,也没有人应该认为它是暗示:

Every time anything anywhere references a variable named <x>, the value will be <y>.

我建议在适当的时候使用 const——也就是说,只要某个特定的变量绑定在它所在的范围内,就永远不会被重新分配。这就是它有效所需要的全部,这就是绝大多数专业开发人员使用它的方式,这就是它的意思。当然,你 没有 - 你可以使用 let - 但是使用 const 会使代码更容易一目了然您知道标识符不会在它所在的范围内重新分配。

避免var尤其是在循环中,特别是如果有任何异步代码被执行的机会——它有不直观的函数作用域,而不是块作用域。 for (let i = 每次迭代都有一个新的绑定; for (var i 只有一个绑定 - 参见 this famous question。 (var 在顶层时也会不直观地在全局对象上创建属性,并且当您尝试在给定范围内多次声明变量时不会警告您,这通常表示存在错误。constlet 没有这些问题。)