我们是否应该使用与let相同的变量来使用滥用,因为我们可以

Should we use abuse using the same variable with let because we can?

本文关键字:我们 变量 因为 是否 let      更新时间:2023-09-26

因此,让我们有一些非常简洁的作用域规则。作为MDN的一个例子:

function letTest() {
  let x = 1;
  if (true) {
    let x = 2;  // different variable
    console.log(x);  // 2
  }
  console.log(x);  // 1
}

在if块内重新声明相同的变量名不是很令人困惑吗?或者这只是一个指出let的作用域规则的坏例子?

有什么好的理由可以仅仅因为我们可以重新声明变量名吗?

这不会令人困惑,因为块会提示每个块范围的变量都属于这个块。对于了解ES6的开发人员来说,这应该不会比函数范围内有一个局部变量更令人困惑。

上面的代码之所以令人困惑,并不是因为x被重新声明,而是因为代码不是自文档的,x变量是多余的,它的名称告诉我们发生了什么,两次

ES5 IIFE

var result;
...
(() => {
  var filteredResult = result.filter(...);
  ...
})();

和ES6块

let result;
...
{
  const filteredResult = result.filter(...);
  ...
}

在同一条船上,为同一个目的服务,他们都不会从可变阴影中获得任何好处。

重用变量名的常见情况是函数参数,并且还需要访问原始变量值:

(result) => {
  result = result.filter(...);
}

另一方面,将块范围的变量放在兄弟块中可能比将它们放在嵌套块中更有实际意义:

if (foo) {
  const request = 'foo';
  ...
}
if (bar) {
  const request = 'bar';
  ...
}

两者都可以完全控制其块范围的变量,如果其中一个变量赋值错误丢失,将抛出ReferenceError