let 和 const 命令

let 和 const 命令

  • let 命令
  1. 声明变量,变量只在let所在的代码块内有效

  2. 不会像var一样,提升变量声明,适合应用于 for 循环

  3. 暂时性死区:如果块级区域内有let变量声明,在其声明语句之前的块级区域部分,为暂时性死区

     var tmp = 123;
     if (true) {
     tmp = 'abc'; // ReferenceError
     let tmp;
     }
    

注意:ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
4. 同一作用域内不允许重复声明变量

  • 块级作用域
  1. 避免内层变量覆盖外层变量,外层代码不受内层变量影响,外层变量无法读取内层变量

  2. 用来的计数的循环变量不会泄露为全局变量

  3. 作用可以多层嵌套{},内层变量与外层变量可以相同

  4. ES6块级作用域内允许函数声明,外层无法引用;虽然允许,但运行会报错,需要采用函数表达式,不用声明语句

     // 函数声明语句
     {
     let a = 'secret';
     function f() {
     return a;
     	}
     }
    
     // 函数表达式
     {
     let a = 'secret';
     let f = function () {
     return a;
     	};
     }
    
  5. do表达式:块级作用域没用返回值,但可以使用do语句,接收整个块级作用域的返回值

     let x = do {
     let t = f();
     t * t + 1;
     };
    
  • const 命令
  1. 声明常量,一旦声明,值就不可改变,因此声明后必须立即初始化,不能留到以后赋值

  2. let作用域类似,只在声明的块级作用域内有效;存在暂时性死区,只能在声明语句后使用

  3. const声明的对象类型,对象不可改变,但对象的属性可以操作

     const a = [];
     a.push('Hello'); // 可执行
     a.length = 0;    // 可执行
     a = ['Dave'];    // 报错
    

本质:const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。
4. 可以使用Object.freeze将对象进行冻结,下方表达式将对对象及其属性都进行冻结

	var constantize = (obj) => {
	  Object.freeze(obj);
	  Object.keys(obj).forEach( (key, i) => {
	    if ( typeof obj[key] === 'object' ) {
	      constantize( obj[key] );
	    }
	  });
	};

NOTE:ES6声明变量的六种方式:var function let const import class

  • 顶层对象的属性
  1. var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。

     var a = 1;
     window.a // 1
    
     let b = 1;
     window.b // undefined
    
  • global对象
    不太理解
春天的雨,夏天的风,只为更好的自己和最爱的你!
原文地址:https://www.cnblogs.com/yfife/p/7204232.html