参考菜鸟教程:https://www.runoob.com/w3cnote/es6-let-const.html
https://www.runoob.com/js/js-let-const.html
let是es6中的一个新的特性,和var一样,let也是用来定义变量的,但与var之间也有一些区别。
let是一个块级作用域,可以解决变量作用域的问题:
1、内部变量覆盖外部变量问题
<script> var str = 'jiang-he'; function name1() { console.log(str); } name1(); // 结果为:jiang-he function name2() { console.log(str); var str = 'hu-hai'; // 等价于: // var str; // console.log(str); // str = 'hu-hai'; } name2(); // 结果为:undefined </script>
2、变量泄露为全局的变量
function fu1(n) { for(var i = 0;i<n;i++){ var i = 10; console.log(i); } } function fu2(n) { for(let i = 0;i<n;i++){ let i = 10; console.log(i); } } fu1(5); // 结果为打印一次10 fu2(5); // 结果为打印5次10
let声明变量的特点
特点1:var有作用域提升,let没有作用域的提升
console.log(a1); // 结果为:undefined,等价于var a1; console.log(a1); a1 = 1; var a1 = 1; console.log(a2); // 结果:报错(Uncaught ReferenceError: Cannot access 'a2' before initialization) let a2 = 1;
特点2:let不能重复申明变量
var b1 = 1; var b1 = 2; console.log(b1); // 后面的赋值会覆盖掉前面的赋值,结果为:2 let b2 = 1; let b2 = 2; console.log(b2); // 报错:(Uncaught SyntaxError: Identifier 'b2' has already been declared)
特点3:和es5中的var、function不同,es6开始let、const、class定义的全局变量不属于顶层对象window的属性
const 声明常量
let c = 3; c = 9; console.log(c); // 变量的值可以被修改结果为:9 const d = 4; d = 8; console.log(d); // 常量一旦声明就不能修改,报错:(dfdf.html:80 Uncaught TypeError: Assignment to constant variable.)