let 是 es6.0 新增的定义变量的方式,用来声明局部变量,用法类似于 var 但也有区别
-
定义块级作用域变量
{ var i=0; } console.log(i);//0
{} 无法限定 var 定义的变量的访问范围
{ let i=0; } console.log(i); //Uncaught ReferenceError: i is not defined
{} 能限定 let 定义的变量的访问范围
-
解决闭包问题共用父级作用域的问题
function test(){ var arr = [] for(var i=0;i<10;i++){ //执行到最后 i = 10 arr[i] = function(){ //这里只是函数的定义,并不会取存 i 的值 console.log(i); } } return arr; } var myArr = test(); for(var j=0;j<10;j++){ myArr[j](); //10个10 }
被保存到外部的10个函数共用一个父级作用域
function test(){ var arr = [] for(let i=0;i<10;i++){ arr[i] = function(){ console.log(i); } } return arr; } var myArr = test(); for(var j=0;j<10;j++){ myArr[j](); //0-9 }
let定义的变量每次执行都是一个全新的作用域,被保存到外部的10个函数有10个不同的作用域
-
let 变量预编译不会提升
console.log(i) var i=0 //undefined
var 定义的变量预编译阶段会声明提升
console.log(i) let i=0 //Uncaught ReferenceError: Cannot access 'i'
let 定义的变量不会提升
-
let 变量不能重复声明
var i=0; var i=1;
var 重复声明并不会报错
let i=0; let i=1; //ncaught SyntaxError: Identifier 'i' has already been declared
let 重复声明报错