let,const共同拥有的特点
提供了代码块级作用域;(代码块是用{}来实现的)
不存在变量提升,先声明再使用;
存在“暂时性死区”;
不允许重复声明;
“暂时性死区”。
ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
在代码块内,使用let或者const命令声明变量之前,该变量是不可用的,这就是“暂时性死区”。只要在块级作用域内存在let命令,它所声明的变量就“绑定”在这个区域,不再受外部的影响。
var tmp = 123;
if(true){
tmp = 'abc';//ReferenceError
let tmp;
}
在这个if的语句块内,tmp跟外面声明的tmp没有关系,所以这个时候tmp相当于是一个新的变量。
“暂时性死区”意味着typeof不再是一个百分百的安全操作了
{
typeof x;//ReferenceError
let x;
}
不允许重复声明
let不允许在相同作用域内,重复声明同一个变量。
//报错
function(){
let a = 10;
let a = 1;
}
const的注意点
const声明一个只读的常量,一旦声明,常量的值是不能改变的。但是const实际上保证的是变量指向的那个内存地址不能改动,并不是变量的值不能改动。
const foo = {};
//可以改变变量的值
foo.prop = 123;
foo = {};//报错
块级作用域与之前矛盾点(稍微知道点就行)
块级作用域与函数声明
本来规定在块级作用域内,是不能有函数声明的。但是浏览器为了兼容以前的代码,所以是允许的。所以ES6在附录中规定,浏览器可以有自己的行为,以下的规则只对ES6的浏览器实现有效,其他环境不用遵守
允许在块级作用域内声明函数
函数声明类似于var,即会提升到全局作用域或者函数作用域的头部
函数声明还是会提升到所在块级作用域的头部
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。