一、声明变量的方式

  • var
  • let (ES6新增)
  • const (ES6新增)

二、letconstvar 的区别

  1. 重复声明:var 可以重复声明,letconst则不能。
  1. var num = 10;
  2. var num = 20;
  3. console.log(num);
  4. // num: 20
  5. let num = 10;
  6. let num = 20;
  7. console.log(num);
  8. // Identifier 'num' has already been declared
  9. const num = 10;
  10. const num = 20;
  11. console.log(num);
  12. // Identifier 'num' has already been declared
  1. 变量提升:letconst 不存在变量提升,而 var 可以。
  1. function f() {
  2. console.log(i);
  3. }
  4. f();
  5. let i = 1;
  6. // Cannot access 'i' before initialization
  7. function f() {
  8. console.log(i);
  9. }
  10. f();
  11. var i = 1;
  12. // undefined 变量提升
  1. 块级作用域:letconst 存在块级作用域,而 var 则没有。
  1. function f() {
  2. let n = 1;
  3. if (n) {
  4. let n = 2;
  5. }
  6. console.log(n);
  7. }
  8. f(); // 1
  9. var n = 1;
  10. function f() {
  11. console.log(n);
  12. var n = 2;
  13. }
  14. f(); // undefined

三、letconst 的优点

  • 避免作用域的污染
  1. const arr = [1,2,3];
  2. for(var i= 0; i < arr.length; i++) {
  3. console.log(i);
  4. }
  5. console.log(i); // 3
  6. const arr = [1,2,3];
  7. for(let i= 0; i < arr.length; i++) {
  8. console.log(i);
  9. }
  10. console.log(i); // Uncaught ReferenceError: i is not defined
  • 方便内存垃圾的回收

术语解释 提升:所有声明(变量和函数)“移动”到各自作用域的顶端。当有重复声明时,函数提升优先于变量提升。