声明与词法作用域同名的变量会导致ReferenceError

时间:2019-02-11 18:02:00

标签: javascript

我确定问题标题很复杂,但我的问题有点棘手。我还将尝试在这个问题上具有启发性。

我正在撰写有关起重的新博客文章,但我遇到了一个问题。

让我们首先举一个例子。

function logCar() {
  console.log('Car: ' + carName);
}
logCar();
var carName = 'Yoyota';

因此,我们希望没有错误的日志:Car: undefined。在幕后,它正在转换为下面的代码。

var carName;
function logCar(){
   console.log('Car: ' + carName)
}
logCar();
carName = 'Yoyota';

因此它正常工作。让我们尝试使用未吊起的let

function logCar() {
  console.log('Car: ' + carName);
}
logCar();
let carName = 'Yoyota';

此代码立即引发ReferenceError: carName is not defined。因此,我可以清楚地了解到未吊起let carName;未被移到块范围的顶部。

然后我想将父作用域用作logCar的词汇作用域,它可以完美工作并输出Yoyota而没有错误。

let car = 'Yoyota';
const logCar = () => {
  console.log(car);
}
logCar();

在我使用的同时,我还可以更改logCar范围内的汽车名称,而不会影响父级。

let car = 'Yoyota';
const logCar = () => {
  let car = 'MWB';
  console.log(car);
}
logCar();
console.log(car);

它输出的正是我所期望的。首先是“ MWB”,然后是“ Yoyota”。然后,我想在variable范围内重新声明logCar汽车,但在声明它之前,我想在词法范围内使用variable

let car = 'Yoyota';
const logCar = () => {
  console.log(car); // ReferenceError: car is not defined
  let car = 'MWB';
  console.log(car);
}
logCar();

然后我遇到一个ReferenceError: car is not defined错误。但为什么? car应该在词法作用域上定义,因为它适用于前面的示例?为什么将let car = 'MWB'添加到该范围中,而不挂起let时会引发错误?

0 个答案:

没有答案