1.ES6之let命令

let 关键字不得不说的关键点:
  • 不存在变量提升
  • 相同作用域内,不允许重复声明一个变量
  • 所声明的变量,只在当前作用域有效,超出所在域即over game(块级作用域)
  • 在代码块内,使用let命令声明变量之前,该变量都是不可用的(在语法上也可以称之为‘暂时性死区‘)
//1. 不存在变量提升
function f(){
        console.log(a); //如果使用var 来声明a变量的话,打印结果应该为undefined
        let a = 11;
    }
    f();  //报错:  Uncaught ReferenceError: a is not defined
//2. 相同作用域内,不允许重复声明同一个变量,当然也包括函数参数
function f(x){

        console.log(x);
        let x = 11;

}
f('a');//报错:Uncaught SyntaxError: Identifier 'x' has already been declared
//但是在不同作用域内不会影响
function test(a){
  console.log(a); //12
  (function(){
      let a = 'hello'
      console.log(a); //hello
  })();
}
test(12);
//3. 块级作用域
为什么需要块级作用域?
ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景
3.1 内层变量可能会覆盖外层变量
var a = 123;
    function f(){
        console.log(a); //undefined
        if(true){
            var a = 'another a';
            console.log(a); //another a
        }
    }
    f();
    //其实本意if 代码块的外部使用外层的a变量,内部使用内层的a变量。但是f执行之后,输出结果为undefined,原因在于变量提升,导致内层的a变量覆盖了外层的a变量
3.2 用来计数的循环变量泄漏为全局变量
var str = 'haha';
for(var i = 0; i < str.length; i++){
     console.log(str[i]);
 }
 console.log(i); //4 
//变量i 只用来控制循环,但是循环结束之后,它并没有消失,泄漏成了全局变量
4.暂时性死区
let a = 'abc';
if(true){
    a = 12;// 报错:Uncaught ReferenceError: a is not defined
    let a;
}
//存在全局变量a,但是在if代码块内 let又声明了一个局部变量a,而在let声明变量之前,使用了这个变量导致报错

ES6规定,如果区块中存在let命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域,凡是在声明之前就是用这些变量,就会报错;
总之,暂时性死区的本质就是:只要已进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值