es6的块级作用域通俗的讲就是一对花括号中的区域(声明对象的花括号不是块级作用域),块级作用域可以嵌套。
let:
1、le声明的变量只在当前(块级)作用域内有效。
2、let声明的变量不能被重复声明。否则同一作用域下会报错,不同块级作用域可以定义同名变量。
3、let不存在变量提升。先打印再声明会报错。
关于暂存死区(了解即可):
1、用var时会从上到下按顺序打印。
2、一般会往上级作用域去找,但用 let 时在es6中向上找到了同一个变量也是拿不到的。因为es6规定如果块级作用域中存在let、const声明的变量,这个变量一开始就会形成一个封闭的作用域。
var monkey = ‘houzi‘; { console.log(monkey); //houzi var monkey = ‘little‘; } console.log(monkey); //little let m = ‘houzi‘; { console.log(m); //报错m is not defined let m = ‘little‘; } console.log(m);
const:
1、声明常量:const c = ‘我是常量‘
2、常量必须在声明的时候被初始化(即赋值)
3、常量不能重复声明、不存在提升、只能在当前(块级)作用域内有效
4、一旦声明常量,就不能改变(引用类型需要冻结)。但是当常量为引用类型的时候,不能保证不改变;当const声明的值为引用类型(对象、数组、函数)时,const只能保证声明的常量地址不变,不能保证地址上的值不去发生改变。const只能保证指向或引用的地址是不变的。
5、使用const声明时,使用小写字母也不会报错,不过大家一般会使用大写字母。
Object.freeze(const)方法可以冻结对象,使其失去被修改的能力(即不能被扩展了)。冻结后的修改会失效,对象的属性依旧为修改之前的。
冻结对象后扩展属性不会报错,冻结数组后扩展属性会报错。这是规定好的。
es6之前使用Object.defineProperty(obj,name,value)方法设置常量对象的属性为不可被修改,再使用Object.seal(对象名)方法设置对象属性不可被扩展。
原文地址:https://www.cnblogs.com/rickdiculous/p/12240875.html