ES6新特性 - let 、const
var声明变量是最常用的声明方式,由于var的一些缺陷(比如变量提升效果),ES6加入let和const。
这里先说变量提升是个什么东西
变量提升
我们有两个区域,在区域1,我们声明,区域2使用,这是很正常的写法,先声明再使用
function mFun() {
var key = 1;// Area 1
console.log('key: ', key);// Area 2
}
运行结果
如果我们这样写
function mFun() {
key = 1;
console.log('key: ', key);// Area 1
var key;// Area 2
console.log('key in window :', key in window);
}
运行结果
可以看到,key = 1; 这个语句并没有将key赋给全局变量window,
key的作用域还是mFun里面,但是key还没声明,我们就给他赋值为1,
说明在mFun里面key已经被定义了。
这里要说的变量提升效果就是如此,你在mFun的任何地方用var定义变量,都和在首行定义的效果是一样的。
下面两段代码是等价的。
看了之后是不是觉得有点熟悉啊,当我们用function定义方法的时候,function可以写在后面,然后在前面的代码调用
这个function也是有提升效果的,相当于在代码第一行做function的定义。
function mFun() {
key = 'name';
value = 'Mike';
console.log('key:',key);
console.log('value:',value);
var key;
var value;
}
function mFun() {
var key;
var value;
key = 'name';
value = 'Mike';
console.log('key:',key);
console.log('value:',value);
}
注意,如果是var声明变量保存function的方式这样是不行的(看下图)。
let
let定义变量,const定义常量,变量可以重新赋值,常量不可以
let 和 var 的使用方式差不多,但是let 必须先声明再使用,否则报错
其次,let有块级作用域,var 只有方法作用域,就是如果在if块或者for、while等块中用var定义的变量,
在方法区域内,依旧存在此变量。(代码运行看到if中定义的key,在if外还能用,因为var定义了key,
在mFun内都可以使用)
let的块级作用域演示,相同的代码,将var改为let,在if的块外访问key说key还没被定义,
let的块级作用也不是非要if,而是let出来的第一层花括号{},就是他的作用域。
下面运行的代码,看到中间的块中再次用let定义了key,对外面的key没有影响
const
说完了let,简单子再说一下const,和java的final类似,定义是不可再修改,并且
在不像Java那样可以先定义,再构造函数进行初始化
js中,const定义的常量必须直接赋值(这点很重要),const和let同样支持块级作用域