Javascript 为什么我不能在这个简单函数中访问这个变量?

Javascript 为什么我不能在这个简单函数中访问这个变量?,javascript,function,variables,scope,let,Javascript,Function,Variables,Scope,Let,我是Javascript新手,我不了解在以下代码中作用域是如何工作的: //Code n°1: let num = 1; function test(){ console.log(num); } test() //As I expected I get in console "1" 但问题是: //Code n°3: let num = 1; function test(){ console.log(num) let num =

我是Javascript新手,我不了解在以下代码中作用域是如何工作的:

//Code n°1:

let num = 1;

function test(){
    console.log(num);
}

test()       //As I expected I get in console "1"
但问题是:

//Code n°3:

let num = 1;

function test(){
    console.log(num)
    let num = 2;
    console.log(num);
}

test()       //I expected to get in console "1" and then "2" but instead I get an error.
当我在浏览器中运行代码n°3时,我收到以下错误: 未捕获引用错误:在初始化之前无法访问词法声明'num'

如果我看一下代码1和代码2,我想在运行代码3之后,我会在控制台中看到数字1,然后是数字2。但事实并非如此。为什么?


非常感谢你

JavaScript异常“无法在初始化之前访问词法声明'variable'”发生在词法变量在初始化之前被访问时。这发生在任何block语句中,当在定义let或const声明之前访问它们时。

如果在未重新声明的情况下初始化变量,它将正常工作,现在如果重新声明变量,则此错误将在let或var中发生,因为在同一作用域中,它正被上一个console.log()调用。 不建议您重新声明let变量,如果需要,不要在前面的语句中使用相同的语句,请注意,如果您在第一个console.log()上进行注释,代码将再次工作,这将在该范围内的变量的生存期内发生,在本例中,让


我认为这被称为暂时死区-我假设你知道这不会发生在
var
上-我还假设你知道var声明是如何被提升的-没有使用let(或const)提升,我本以为错误是关于重新定义
num
。相反,错误是关于在初始化之前访问
num
,如果不深入了解JavaScript的解释方式,这是没有意义的,我没有这样的理解。我无法在上面进行评论,但您需要删除导致重新声明的let。这在javascript中是不允许的。代码2正在工作,因为变量的重新声明不会发生在函数内部。第一个实例在它的外部,然后在函数内部更改它的值,这很正常。
//Code n°3:

let num = 1;

function test(){
    console.log(num)
    let num = 2;
    console.log(num);
}

test()       //I expected to get in console "1" and then "2" but instead I get an error.
let num = 1;

function test(){

    console.log(num)
    let num = 2;
    console.log(num);
}

test()