《ES6学习笔记-let命令》

109 阅读2分钟

let命令

基本语法

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

{
 let a = 10
 var b = 1
}
a//未定义a
b//1

上面代码中,分别用let和var声明了两个变量。在代码块外调用了这两个变量,let声明的变量a报错,var声明的变量b返回了正确的值。这表示,let声明的变量只在它所在的代码块内生效

不存在变量提升

var命令所创建的变量,会有变量提升这一现象,即变量可以在声明之前使用,值为undefined。

为了纠正这种现象,let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。

//var
console.log(f1)//输出undefined
var f1 = 1

//let
console.log(f2)//报错
let f2 = 1

上面代码中,变量f1用var命令声明,会发生变量提升,即脚本开始运行时,但没有被赋值,所以输出undefined。变量f2用let命令声明,没有发生变量提升,表示在声明f2之前,f2是不存在的,如果答应则会报错。

暂时性死区

只要会计作用域存在let命令,它所在的变量就绑定(binding)这个区域,不受外部的影响。

var a = 1

{
  console.log(a)//报错
  let a = 2
  console.log(a)//2
}
 console.log(a)//1

只要块级作用域类存在let命令,它所声明的变量就会绑定这个区域,不受外部影响。

如果块级作用域中存在let和const命令,这个块作用域对这个命令声明的变量,从一开始就形成了封闭作用域。

暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。

不允许重复声明

let不允许在相同作用域内,重复声明同一个变量。

// 报错
function func(){
  let a =10
  var a =1
}
  
// 报错
function func(){
  let a =10
  let a =1
}

因此,不能再函数内部重新声明参数。

function func(arg){
  let arg
}
  func()// 报错

function func(arg){
{
 let arg
}
}
 func()// 不报错

总结

  1. 遵循块级作用域,适用范围不能超出当前块级作用域
  2. 不能重复声明
  3. 可赋值,也可以不赋值
  4. 必须先声明在使用,否则报错
  5. 全局声明的let变量,不会变成window属性