一 let命令
1.1 let命令
let类似于var,,但是let所声明的变量只在let所在的代码块中有效。 在同一个代码块中用var和let声明变量,在代码块外进行引用,var声明的变量返回正确的值,而let的变量会报错。
1.2 不存在变量提升
var声明的变量存在变量提升的现象,变量在声明前使用,会输出undefined;这说明此时这个变量存在的但是没有赋值,所以undefined。而let不存在变量提升,相当于这个变量还不存在,输出ReferenceError。
function(){
console.log(a);
var a=1;//undefined
}
function(){
console.log(a);
let a=1;//ReferenceError
}
1.3 暂时性死区
let所声明的变量会‘绑定’这个区域,不再受外部的影响。ES6规定,如果在区块中存在let和const,那么这个区块对这些命令声明的变量从一开始就形成了封闭作用域,如果在声明之前就使用,就会报错。
所以,在代码块内,使用let声明变量之前,该变量都是不可用的,这就叫'暂时性死区'。
有一些'死区'很隐蔽,比如:
function bar(x=y,y=2){
return [x,y];
}
bar();
会报错,因为当x=y时,y还没有声明,属于'死区',如果y的默认值是x,则不会报错,因为x已经声明。
1.4 不能重复声明
不允许在相同作用域中重复声明同一个变量
function(args){
let args=aa;//报错
}
二 块级作用域
2.1 ES6中的块级作用域
function f1(){
let n=5;
if(true){
let n=10;
}
console.log(n)//5
}
上面两个代码块,都执行了n,但是输出了5,因为有了块级作用域,外层和内层代码块不会互相干涉。
2.2 块级作用域和函数声明
应该避免在块级作用域中声明函数,如果确实需要,也应该写成函数表达式的形式,而不是函数声明语句。
let f =function(){}//函数表达式
2.3 do表达式
本质上,块级作用域是一个语句,没有返回值。在块级作用域外,没有办法得到内部变量的值,除非他是全局变量。 如果想得到返回值,可以用do表达式。
三 const命令
3.1 const声明一个只读的变量。
const实际上保证的并不是变量的值不能改变,而是变量指向的那个内存地址不得改动
const foo={};
foo.prop=123;//可以进行添加属性,或者赋值操作等都可以
foo.prop;
foo={};//将foo指向另一个对象,就会报错
3.2 es6声明变量的六种方式
var,function,let,const,import,class