ES6 —— let和const

let

let声明一个变量,与var最不同的地方在于。let拥有块级作用域,{ } 所包裹住的地方即为一个块级作用域。

块级作用域中声明的变量在外部无法访问,for循环中:


for(let i = 0; i<3;i++){
  let i = 12
  console.log(i)
}
// 输出3次12

for 循环有两个块级作用域,设置循环变量的是父作用域,{}中的是子作用域。


let arr =[]
for (let i = 0;i<3;i++){
  console.log(i)
  arr.push(function(){
      console.log(i)
  })
}
console.log(i)
console.log(arr[1]())
// 输出 0 ,1 ,2
// 输出 i not defined
// 输出 1

for (var i = 0; i<3; i++){
  console.log(i)
  arr.push(function(){
    console.log(i)
  })
}
console.log(i)
console.log(arr[1]())
// 输出 0 ,1 ,2
// 输出3
// 输出3

let i 只执行了一次,但由于let的创建是尊重块级作用域的,所以每次循环都是一个新的i,值是i++的结果,所以闭包引用的i的地址都是不同的。用var声明的i都是同一个地址,所以闭包的结果是相同的。

暂时性死区和不允许重复声明

在一个块级作用域中,let和const声明的变量就绑定了这个区域,外部声明的与之无关。在块级作用域中声明之前引用这两个变量会报错,称之为暂时性死区。

let a = 1 
if (true) {
  console.log(a)   // a is not defined
  let a = 2
  console.log(a)   // a has already been declared
}

let 和const不存在变量提升,不同于var

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 基本都是从阮一峰大神的文档中摘录的重点,链接:http://es6.ruanyifeng.com/?search=...
    立的flag一直在倒阅读 314评论 0 0
  • let和const命令 let let命令与var类似,但是所声明的的变量只能在let所在的代码块内有效,let不...
    coolheadedY阅读 267评论 0 0
  • 1、let命令 基本用法 let用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内...
    开车去环游世界阅读 483评论 0 0
  • 1、let命令 基本用法 let用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内...
    壮哉我大前端阅读 191评论 0 1
  • 基本用法 let 和const是ES6新增的两种,声明变量的方法,用法与var 类似,但都有各自的特点和用途。 l...
    王阿王阅读 238评论 0 0