let是ES6中新增的,是对变量的声明。与var用法类似,但是大有不同。
1. let不允许重复声明变量,var可以
1 var a = 1; 2 var a = 2; 3 console.log(a); //输出结果为 2
1 let b = 2; 2 let b = 3; 3 console.log(b); //报错
但是,如果let声明了一个变量,变量的值可以改变。
1 let b = 2; 2 b = 3;//这里是赋值,不是声明 3 console.log(b); //3
2. let没有变量提升,也就是不会在预解析的时候进行解析。
1 console.log(a);//undefined 2 var a; 3 4 console.log(b); 5 let b; //报错
3. 声明的变量只在let命令所在的代码块内{}有效。
1 for(let i = 0; i < 3; i++){ 2 i = i; 3 } 4 console.log(i); //ReferenceError: i is not defined
1 for (var i = 0; i < 3; i++) { 2 i = i; 3 } 4 console.log(i);//3
ES6中允许块作用域任意嵌套,外层无法访问内层的变量。但是内层可以访问外层,也就是子级访问父级;
1 { 2 let a = 1; 3 { 4 console.log(a); //1 5 { 6 console.log(a); //1 7 } 8 } 9 }
1 { 2 console.log(a); //ReferenceError: a is not defined 3 { 4 let a = 1; 5 } 6 }
1 { 2 console.log(a); //undefined 3 { 4 var a = 1; 5 } 6 }
注意:上面代码结果为undefined,是因为预解析,var a变量提升;
在下面for循环中,如果使用var,将返回5。
1 var arr = []; 2 for(var i = 0; i < 5; i++){ 3 arr[i] = function(){ 4 console.log(i); 5 } 6 } 7 arr[3](); // 输出5;
因为,var 声明的i是一个全局变量,i 的值随着每次循环发生改变,但是function里面的 i 都是指向同一个 i,那就是全局的变量 i,也就是说返回的是循环结束后最终的 i 的值5。
用白话来说的话就是,每次循环都给数组增添了一个值,随着循环的进行,已经加入到数组了,每个值都是一个函数,每个函数都是function(){console.log(i)};for循环在一瞬间就完成了,当去调用函数时,函数让输出i,i指向全局,此时循环结束 var i = 5;所以最终返回5。
如果将for循环的var声明改成let声明,那么将会返回3。
1 var arr = []; 2 for(let i = 0; i < 5; i++){ 3 arr[i] = function(){ 4 console.log(i); 5 } 6 } 7 arr[3](); // 输出3;
这是因为如果i用let来声明,那么当前的i只在本轮循环有效,每次的循环都是重新定义i。那么重新定义的话为什么i的值不一直是0?这是因为javascript引擎内部会记住上一次循环的值,再进行初始化时,是按照上一次循环的基础进行计算。
此外,在for循环中,设置循环变量那部分是一个父级作用域,而循环内部是一个单独子作用域。
1 for(let i = 0; i < 2; i++){ 2 let i = 200; 3 console.log(i); 4 //200 5 //200 6 }
for循环的内部是一个子作用域,let声明只在该代码块有效,所以外层let不受影响,循环2次。
硬性标准:代码块{}内,let声明的变量就绑定在这个区域,不再受外部的影响。
再来说说const
const也ES6新增的定义常量的关键字。注意:一旦声明,常量的值不能改变的!
1. 常量一定要赋值,否则报错
1 const a; 2 console.log(a); //SyntaxError: missing = in const declaration
2. 常量的值不能改变,改变会报错
1 const a = 10; 2 a = 99; 3 console.log(a); //TypeError: invalid assignment to const `a'
3. 常量不能重复声明,否则报错
1 const a = 10; 2 const a = 99; 3 console.log(a); //SyntaxError: redeclaration of const a
其他特点和let一样