所以,让我们有一些非常简洁的范围规则。以MDN为例:
function letTest() {
let x = 1;
if (true) {
let x = 2; // different variable
console.log(x); // 2
}
console.log(x); // 1
}
在if-block中重新声明相同的变量名称会不会让人感到困惑,或者这只是指出let
的范围规则的一个坏例子?
为什么我们应该重新声明变量名称是否有充分的理由,因为我们可以?
答案 0 :(得分:2)
这不会令人困惑,因为一个块提示每个块范围的变量都属于这个块。对于支持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
。