我确定问题标题很复杂,但我的问题有点棘手。我还将尝试在这个问题上具有启发性。
我正在撰写有关起重的新博客文章,但我遇到了一个问题。
让我们首先举一个例子。
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时会引发错误?