let的介绍let是ES6新增的命令。作用:声明变量。类似于:var。与var的区别:使用let声明的变量,只在其所在的代码块内有效。定义回顾声明变量:可以用var,也可以不用var。是否允许变量提升:允许。是否允许重复声明同一个变量:允许。变量的作用域:全局作用域、函数作用域。在全局作用域中,无论是否使用var,定义的变量都是全局变量。在函数作用域中,使用var定义函数局部变量,不使用var定义全局变量。全局变量全局可用,函数局部变量在函数内可用。代码块:用{}栝起来的代码片段。基本语法let声明的变量,只在其所在其所在的代码块内有效。let不存在变量提升。let不允许重复声明。let不允许在函数的一级作用域内重新声明参数。let存在的块级作用域,它声明的这个变量或“绑定”这个区域,形成“暂时性死区”,使其不再受外部影响。就是说,一个变量,无论其在外部是否声明,只要在某个块级作用域内使用let重新声明了,那么在这个块级作用域内该变量在声明前是不可以使用的。使用场景for循环的计数器let声明的循环变量i只在本轮循环有效,每一次循环的i都是一个新变量。特别的JavaScript引擎内部会记住上一轮循环的值,初始化本轮的变量i时,是在上一轮循环的基础上进行计算。另外,for循环设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的自作用域。代码片段part 1:var声明变量回顾<script type=“text/javascript”> var a = 1; console.log(a); // 1 b = 2; console.log(b); // 2 console.log(c); //undefined var c = 3; var a = 4; function showA(){ console.log(a); d = 5; console.log(d); } showA(); // 4,5 console.log(d); //5 function showB(){ console.log(b); var e = 6; console.log(e); } showB(); //2,6 console.log(e); //报错</script>part 2:let声明的变量时局部变量<script type=“text/javascript”> { var a = 1; let b = 2; } console.log(a); //1 console.log(b); //报错</script>part 3:for循环中使用var定义循环参数,该参数会变味全局参数<script type=“text/javascript”> var a = []; for(var i = 0; i < 10; i++){ a[i] = function(){ console.log(i); } } a6; //10</script>part 4:for循环中使用let定义循环参数,改参数是块级作用域内的参数<script type=“text/javascript”> for(let i = 0; i < 10; i++){ } console.log(i); //报错</script>part 5:对比part3,用var定义循环变量<script type=“text/javascript”> var a = []; for(let i = 0; i < 10; i++){ a[i] = function(){ console.log(i); } } a6; // 6</script>part 6:for循环中,外层是一个父作用域,里面的每层循环是一个自作用域,互不影响<script type=“text/javascript”> for(let i = 0; i < 3; i++){ let i = ‘abc’; console.log(i); //abc,abc,abc }</script>part 7:let声明的变量不允许变量提升<script type=“text/javascript”> console.log(a); //报错 let a = 1;</script>part 8:块级作用域中用let声明的变量会形成【暂时性死区】,即使在全局声明了该变量,也不能在let声明前调用<script type=“text/javascript”> let a = 1; console.log(a); //1 { a = 2; let a; console.log(a); // 报错 }</script>part 9:let声明的变量不允许重复声明<script type=“text/javascript”> let a = 1; console.log(a); // 1 let a = 2; console.log(a); //报错</script>part 10:不允许在函数的一级作用域内使用let重新声明参数<script type=“text/javascript”> function showName(name){ let name = ‘sunny’; console.log(name); } showName(’lily’); // 报错</script>part 11:可以在函数的二级或三级等作用域内使用let重新声明参数,且与一级作用域中的参数互不影响<script type=“text/javascript”> function showName(name){ console.log(name); { let name = ‘sunny’; console.log(name); } } showName(’lily’); //lily,sunny</script>