ES6 let 和 const命令(学习笔记)

1.暂时性死区:只要块级作用域内有 let 命令,它所声明的变量就绑定(bounding)这个区域,不再受外部的影响。也就是说在代码块内使用 let 命令声明变量之前,该变量都是不可用的,在语法上,这被称为“暂时性死区”。

var tmp = 123;

if(true){
   console.log(tmp);  //ReferenceError
   let tmp;
}

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

2.不允许在同一个作用域内重复声明同一个变量,否则会报错。

3.块级作用域与函数声明:在ES5中明确规定,函数不能只能在顶级作用域或函数作用域中声明。但ES6 中引入了块级作用域之后,明确允许函数可以在块级作用域中声明,函数声明语句的行为类似 let 语句,在块级作用域之外不可引用。

function f(){ console.log("i'm outside");  }

(function(){
   if(false){
      //重复声明一次 function
      function f(){
          console.log("i'm inside");
      }
   }

   f();
}());

在 ES5 中,会得到 “i'm inside”,但在 ES6中会报错,这是因为改变了块级作用域内声明的函数的处理规则,会对老代码产生影响。为了减轻因此产生的不兼容问题,ES6 规定,浏览器的实现可以不遵守上面的规定,有自己的行为方式

(1)允许在块级作用域内声明函数。

(2)函数声明类似于 var ,即会提升到全局作用域或函数作用域头部。

(3)同时,函数声明还会提升到所在的块级作用域的头部。

考虑到环境导致的行为差异改变太大,应该避免在块级作用域内声明函数。如果确实需要,也可以写成函数表达式,而不是函数声明语句。

//块级作用域声明函数,不建议使用
{
 let a = "secret";
 function f(){
    return a;
 }
}

//块级作用域内,优先使用函数表达式
{
 let a = "secret";
 let f = function(){
    return a;
 };
}

4.const 声明的变量数据类型简若是简单数据类型( 数值,字符串,布尔类型)的值,则值不得改变,所以在声明的时候必须赋值,否则会报错。其实是因为变量指向的内存地址无法改变。但若是用 const 来声明复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const 只能保证这个指针是固定的(即总是指向一个固定的指针),至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须小心。

//例1
const a;
console.log(a);  //报错

//例2
const obj = {};
obj.a = 123;   //为 obj 添加一个属性可以成功

obj = {};   //将 obj 指向另一个对象会报错

//例3
const a = [];
a.push("hello");  //可执行
a.length = 0;     //可执行

a = ["world"];    //会报错

若想将对象冻结,可以使用 Object.freeze() ,除了将对象冻结,对象的属性也应该冻结。

const obj = Object.freeze({});

obj.a = 123;   //这行语句在正常模式下不会起什么作用,但在严格模式下会报错

 

你可能感兴趣的:(ES6 let 和 const命令(学习笔记))