最近在看es6,就记录一下笔记好供日后参考。
1.变量声明 var
众所周知在es6之前js的变量没有块级,只存在函数内外访问之分;
例如:
var a = 5;
if(true){
var b = 3;
console.log(a) // 5;
var a = 's';
}
console.log(a) // s;
console.log(b) // 3;
从上面的代码可以知道var定义的a在if语句块中一样可以被访问和修改,同样在if语句块里面定义的变量b,在其快外面也一样可以被访问和修改;所以在es6之前用var定义声明一个变量时不会存在if,for这些语句块的作用域。
接下来看一下es6中新增的变量声明let;
2.变量声明let
let也是用来声明变量的,但是所声明的变量,只在let命令所在的代码块内有效。
例如:
if(true){
let b = 3;
console.log(b) // 3;
var a = 's';
}
console.log(a) // s;
console.log(b) //报错 b is not defined;
也就是在if语句块中用let定义的变量b,出了这个区域块就没法获取到b了,这和var就不一样了;根据这一特性申明很适合在for循环块中申明变量;举一个es5的一个常见问题:
var arr = [];
for(var i =0;i<6;i++){
arr[i] = function(){
console.log(i)
}
}
arr[3]();//6
在上面的代码中i是被var定义的没有语句块的限制,当循环结束后他的值被累加到6了,当你再去调用函数去访问i时,不管是arr[3]还是arr[4]或者其他的得到的都会是6;因为它的值在循环结束后已经更新为6了;下面如果我们改成let声明i会怎样呢?
var arr = [];
for(let i =0;i<6;i++){
arr[i] = function(){
console.log(i)
}
}
arr[3]();//3
得到的结果是我们想要的.
3.变量常量声明const
(1)const 声明的是常量,一旦声明,值将是不可变的
const PI = 3.1415;
PI = 3;// 抛出异常:Assignment to constant variable.不能给一个常量再赋值;
console.log(PI) //3.1415
(2) const 也具有块级作用域
if (true) {
const a = 5;
}
console.log(a);// a is not defined;
(3) const声明的常量没有声明提前的效果,也不能被重复声明;
var a = 5;
function b(){
console.log(a);
var a = 5;
}
b();//undefind 这里得到的undefined就是因为函数内部有var声明提前造成的;这个例子是题外话,一个比较常见的陷阱
if(true){
console.log(PI);// 抛出一个错误PI is not defined
const PI = 3.14
}
if(true){
console.log(PI);// 不会报错只会打印出undefined,说明他已经声明了只是没有赋值
var PI = 3.14
}
//重复声明
var message = "Hello";
const message = "Goodbye!"; //会报错 Identifier 'message' has already been declared
今天就先记录到这里,以后持续更新~~