1. let 和 const 命令

一、简单认识

1. 用let来声明变量,变量作用域就在{}(块级作用域)中

2. 用const声明变量,变量值不可更改

3. 增加了let以后,在声明变量时应该多考虑一下变量的用途,是否希望只在当前代码块中使用(C++就不同了,它声明的变量都是属于当前代码块的)

二、let命令

1. 在{}中用let定义一个变量,只能在该{}中访问

1 {
2     let a = 10;
3     console.log(a);//10
4 }
5 console.log(a);//a is not defined
View Code

2. for循环计数中使用let

  • 定义的i只在本轮循环中有效,每次新的循环中,i都是重新声明的
1 var a = [];
2 for(let i = 0; i < 10; i++){
3     a[i] = function(){
4         console.log(i);
5     }
6 }
7 a[6]();//6,不是10
View Code
  • 父子作用域:声明循环变量的是父,而循环体内部是单独的子作用域
1 for(let i = 0; i < 3; i++){
2     let i = "abc";
3     console.log(i);
4 }
5 // 输出三次abc,循环变量i没有被循环体内部定义的i影响
View Code

3. 没有变量提升

  • 必须先声明才能使用(和C++一致,而var会把变量提升到作用域最上面) 
1 bar = 2;
2 let bar;
3 //报错:bar is not defined
View Code

4. 暂时性死区

  • 在有let命令的作用域中,由let声明的变量在未声明前不可使用即使它的上层作用域中已经声明)。该作用域中,let声明某变量前都是该变量的死区(不可使用) 
    1 var tmp = 123;
    2 
    3 if (true) {
    4   tmp = 'abc'; //tmp is not defined
    5   let tmp;
    6 }
    View Code
  • typeof的问题:未声明前访问也会报错

    1 typeof x;//报错:x is not defined
    2 let x;
    3 typeof y;//"undefined"
    View Code
  • 赋值语句中的问题,未声明前的变量不可以给其它变量赋值
    1 let x = x;//x is not defined
    2 function fun(x = y){
    3 }
    4 fun();//y is not defined
    View Code

5. 不可以重复声明变量

1 let x;
2 let x;//报错:x is already been declared
View Code

三、块作用域中声明函数

  • 在块作用域中声明函数与var变量类似,会进行变量提升(到函数作用域或全局作用域,而不是块作用域)
  • 应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句
 1 // 浏览器的 ES6 环境
 2 function f() { console.log('I am outside!'); }
 3 
 4 (function () {
 5   //var f = undefined;//提升到这里
 6   if (false) {
 7     //函数f的声明提升到函数作用域或全局作用域头部
 8     function f() { console.log('I am inside!'); }
 9   }
10   //因为false,所以没对f进行赋值
11   f();//f is not a function
12 }());
View Code

四、const命令

  • 一旦声明,必须立即初始化
  • 与let相似的特性:块级作用域、不提升、暂时性死区、不可重复声明
  • 指向的内存地址不可变,但内存的内容可以变
1 const a = [];
2 a.push('Hello'); // 可执行
3 a.length = 0;    // 可执行
4 a = ['Dave'];    // 报错,不可以修改const变量的指向
View Code

五、顶层对象属性

  • 顶层对象,在浏览器环境指的是window对象,在 Node 指的是global对象
  • let、const声明的变量不属于顶层对象的属性
     1 var a = 1;
     2 window.a;//1
     3 function b(){
     4     console.log("b");
     5 }
     6 window.b();//b
     7 
     8 let c = "c";
     9 window.c;//undefined
    10 const d = "d";
    11 window.d;//undefined
    View Code
posted @ 2017-12-03 15:32  huapyuan  阅读(318)  评论(0编辑  收藏  举报