let与var的用法决定性,在代码块中的结构原理怎么样的?

疑惑:

  var与let的各自用法,有什么不同?

1.var与let特性:

  var:

    (1)var 存在变量提升;

    (2)var 存在全局声明,var也存在局部声明。

  let:

    (1)let 不存在变量提升;

    (2)let 存在块作用域;

    (3)let 不能重复声明。

  这是字面上的理解,如果懂这些专业术语,应该大概就明白了。

2.如何理解var的特性?

  (1)变量提升:

      变量提升是指,在全局里面或者在某一个方法里面,声明了一个变量(比如:var a /var a=1,后面的a=1是赋值了),此时被声明的变量就能在全局里面或者在声明的方法里面都能找得到,不管声明代码(var a /var a =1)是在这个全局或者方法在最后一行,还是最开始一行,只要想要用它,都能找得到。但是注意如果用这个变量,在给这个变量赋值之前,就会显示undefined显现,因为还没有赋值就用了。

  (2)全局声明和局部声明:

    全局声明:声明之后的变量称为“全局变量”,在整个文件、整个class、js里面,只要声明了该变量,就能在这个整体里面使用,包括这个文件里面的方法也可以使用该变量。

    局部声明:在这个文件里面的,某个方法里面声明的变量称为“局部变量”,这个变量只能在该方法里面被使用,在这个方法外是无法条用到这个变量。

  (3)var实际应用剖析:

    例子1:

    

    请问您的猜想结果是不是:{99_10_99}  {99_10_10}  {10_10_99}

    结果:

    

     没想到吧!{undefined_10_99},肯定会疑惑undefined是怎么得来的?

    解析:

    step1: 首先声明了变量a(var a =99)。

    step2: 执行调用的方法f(),进入方法里面。此时可见方法里面有两个输出a值,在第一个输出为什么是a=undefined? 因为var存在变量提升在方法里面依然适用,正因为第一个输出在赋值之前,所以为undefined,这里会有同志问,外边不是声明的全局变量了吗?但var也存在局部作用,所以在这个方法里面就相当于在一个新的文件里面,某种程度上理解肯更像一个bug对吧。个人理解是把这个方法当作一个整体去看,这个整体里面声明了全局var a,但是第一个输出在赋值之前,所有找不到a=undefined。当然在方法里面第二个输出a,是在赋值之后,所有为a=10。

    step3: 方法f()执行完成之后,跳转到外面的输出,此时外部全局变量a,并不受内部影响输出a=99。

     

    例子2:

    

    请问您的猜想结果是不是:{undefined_10_99}  {99_10_99}  {10_10_99}

    结果:

    

    又是一把惊呼?结果:{99_10_10}

 

    解析:

    step1: 调用f()之后,进入方法f(),里面没有再用var声明,所以里面没有什么声明部分,直接执行输出,此时方法f()内部第一个输出a为外部的全局变量,所以a=99。

    step2: 可见常理在方法f()中的 a=10,只是单纯的赋值,所以a被重新赋值;所以方法内部的第二个输出即为a=10.

    step3: 因为整个全局中只有一次声明了a,所以a这个变量始终没有变,唯一变的就是a被赋值了两次,第二次赋值就覆盖了第一次赋值;所以方法f()外部的输出a=10。

 

3.如何理解let的特性?

  (1)let不存在变量提升:

    由上面的 var 对比可知,当在一个全局内声明let 或者 在一个方法内部,用let声明一个变量(let a/let a=1,后面a=1是赋值了),虽然在全局内 或者 在方法内部声明了,但是调用使用的时候,必须在声明之后才能使用,不然直接报错(错误:在未声明前调用,因为不存在变量提升)。

  (2)let存在区块作用域:

    

    如图,当let a=10声明在 f() 方法内部时,a变量只能在 f() 内部有效,在其他地方没有用,即无法调用,类似于局部变量。

  (3)let 不能重复声明:

    

    如图,当同时声明相同变量let a 时,就会出现报错,let不能重复声明。

  (4)let实例应用剖析:

    例子:

    

     请问您的猜想结果是不是:{undefined_10_99}  {99_10_99}  {10_10_10}

 

    结果:

    

    直接爆,星星个星星错误。

    解析:

    step1: 首先调用 f() 进入方法内部。

    step2: 在方法 f() 内部,首先let不存在变量提升,所以后面声明的let a,在第一个输出之前是不存在 a 的!!所以这里直接报错,报错就不会进行下一步。

    step3: 结束?结束!

4.总结部分

  这里的重点在于,如何把思维突破。

  (1)对于 var 不管是在整个文件内部声明还是在一个具体的方法内部,都会存在变量提升;最值得注意的就是,尽管一个文件里面用 var a; 声明了一个 a 全局变量,但是如果同时也在某一个方法内部 var a; 声明了一个 a 变量,此时方法内部的 a 会把方法当作一个整体去看;在方法内部前提下,在 var 之前调用或者输出 a 就会出现undefined,因为在给 a 赋值之前调用或者输出。

  (2)对于 let 如果在let a; 在声明 a 之前调用或者输出就会直接报错,因为 let 声明不存在变量提升。

 

                        希望能帮到您解答疑惑,感谢您的细心阅读。

   

posted @ 2020-11-03 15:10  大韦哥  阅读(270)  评论(0)    收藏  举报