let 和const

1.let

用法类似var,但是声明的变量只在代码块中有效

{    
      let a = 0;
      var b =1;
}
a //ReferenceError:a is not defined 
b //1

比如下面的案例:

var a = []
for(var i = 0;i<10;i++){
    a[i]=function(){
      console.log(i)
    }
}
a[9](); // 10
....
a[0](); // 10

会发现,输出的结果都是10,如果想输出每一次的i的值,可以使用IIFE,或者最简单的,把 var 改成 let

暂时性死区

只要块级作用于存在let声明的变量,那么这个变量就绑定了这个区域,不会在收到外部的影响

var a = 0;
if(true){
  a = 123; // referenceerror
  let a;
}
不允许重复声明
function(){
  let a=0;
  let/var a =1; //报错
}

2.块级作用域

为什么需要块级作用域

比如:

for(var i = 0;i<5;i++){
    ......
}
console.log(i); //5

变量i只想用来控制循环,但是循环结束后,i没消失,而泄露成了全局变量.

ES6的块级作用域

比如:

function(){
  let a =1;
  if(1){
      let a = 2;
  }
console.log(a) // 1
}

两个代码块都声明了变量a,但是外层代码块不受内层代码块的影响.

块级作用域与函数声明

ES5 规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明。但是浏览器为了兼容以前的旧代码,支持在会计作用于之中声明函数,不会报错.

表现:在浏览器的 ES6 环境中,块级作用域内声明的函数,行为类似于var声明的变量。

const

const声明一个只读的常量,一旦声明,值就不能改变

const p=3.14;
p// 3.14 
p= 1 ;TypeError: Assignment to constant variable.

因为值无法改变,所以在声明的时候,就必须初始化,否则会报错

const p;  //SyntaxError: Missing initializer in const declaration

作用域与let相同,且与let一样不可重复声明

const本质

const本质是保证const声明的变量指向的地址不得改动.
比如:

const p = {}
p.a='a'
p= '123' //TypeError: "p" is read-only
other

letconst 都不存在变量提升,

顶层对象

顶层对象,浏览器中是window node中是global

window.a=1
a  //1

全局变量跟顶层对象的属性是等价的.但在es6中 var 和function 声明的依旧是顶层对象,但是let,const,class声明的全局变量,不在属于顶层对象.

你可能感兴趣的:(let 和const)