TypeScript中let与var的区别

一、作用域不同:

        用var声明的变量,只有函数作用域和全局作用域,没有块作用域。而使用let声明的变量具有块作用域,使变量只能在“{}”有效,而在“{}”外部无法访问:

TypeScript中let与var的区别_第1张图片

        循环作用域:在for循环中,不仅循环体“{}”会生成对应的块作用域,循环条件“()”也会生成对应的块作用域,循环条件的块作用域可是循环体块作用域的父级作用域,所以可以使用let跨越“()”和“{}”作用域。

TypeScript中let与var的区别_第2张图片

 

二、let没有变量提升

        这一点可以和C/C++的语法一致理解,遵循“先声明,后调用”的原则。在代码块内,使用let命令声明变量之前,该变量是不可用的。在语法上,称为:“暂时性死区”。

TypeScript中let与var的区别_第3张图片

TypeScript中let与var的区别_第4张图片 

三、let变量不能重复声明:

        使用var声明变量,允许多次对一个变量进行声明,不会报错,只会得到一个变量,最后声明的值会对前面的进行覆盖。而let相对严格,无法多次声明同一个变量,一个变量只能声明一次。

        如果使用var多次声明的变量用处不一样,由于程序员失误导致该变量重复声明,会产生很多意想不到的错误,这些错误往往很难察觉。

TypeScript中let与var的区别_第5张图片

TypeScript中let与var的区别_第6张图片 

四、for循环中的let和var:

        TypeScript中let与var的区别_第7张图片

    上述代码三次打印结果都是:3

  • “()”属于块作用域,var声明的变量没有块作用域,此处相当于全局作用域。并且var声明的变量允许重复声明,上述代码中i被定义了重复定义了3次,最终的值一最后一次为准。
  • javascript是单线程,setTimeout()会等for执行完毕之后开始计时,此时i的值为3,所以最终打印3

TypeScript中let与var的区别_第8张图片

        上述代码三次打印结果是:0,1,2

  • 变量j是使用let声明的,当前的j只在本轮循环有效,每次循环的j其实都是一个新的变量。
  • 在for循环中,“()”循环条件产生的块作用域是“{}”循环体产生的块作用的父级作用域,使用let声明的变量可以跨越。

 

  

你可能感兴趣的:(cocos,creator,typescript,javascript)