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
let
和const
都不存在变量提升,
顶层对象
顶层对象,浏览器中是window
node中是global
window.a=1
a //1
全局变量跟顶层对象的属性是等价的.但在es6中 var 和function 声明的依旧是顶层对象,但是let
,const
,class
声明的全局变量,不在属于顶层对象.