ES6学习--let和const命令

151 阅读2分钟

一 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