let,const共同拥有的特点

  1. 提供了代码块级作用域;(代码块是用{}来实现的)

  2. 不存在变量提升,先声明再使用;

  3. 存在“暂时性死区”;

  4. 不允许重复声明;

“暂时性死区”。

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,即会提升到全局作用域或者函数作用域的头部

  • 函数声明还是会提升到所在块级作用域的头部


jyren_Rachel
107 声望4 粉丝

« 上一篇
初识fetch