ES6创建变量Let

57 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天juejin.cn/post/712312…

Let命令

基本用法:

ES6新增了let命令,用来声明变量,它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。

在for循环计数器中,最适合用let命令
例如:for(let i=0; i<10; i++){ //父作用域
          a[i]=function(){
              console.log(i)
          }
      }
      a[6]();
解释:变量i是let声明,当前的i只在本轮循环有效,所以每一次循环的i其实嗾使一个新的变量,所以最后输出的是6
javascript引擎内部会记住上一轮循环的值,初始化本轮的变量时,就在上一轮的基础上进行计算。

用var声明的变量是每次输出的都是最后一个不符合条件的那个i

另外,for循环还有一个特别之处,就是设置循环循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。

不存在变量提升

  • var命令会发生“变量提升”现象,即变量可以在声明之前使用,值为undefined。这种现象多多少少是会有些奇怪的。按照一般的逻辑,变量应该在声明语句之后才可以使用。
  • 为了纠正这种现象,let命令改变了语法i行为,它所声明的变量一定要在声明后使用,否则报错。

暂时性死区

  • 是要块级作用域内存在let命令,它所声明的变量就“绑定”这个区域,不再受外部的影响。
  • var tmp = 123 ; if(true){tmp = ‘abc’ ;let tmp;}
  • 上面代码中,存在全局变量tmp,但是块级作用域let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let声明变量前,对tmp赋值会报错。
  • ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成封闭了封闭作用域,凡是在声明之前就使用这些变量,就会报错。
  • 总之,在代码块内,使用let命令声明变量之前,改变了就是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称TDZ)

不能重复创建,否则直接报错