es6 let 和 const 命令

一.let

1.作用域

在javascript中只有全局作用域和函数作用域,并不存在块级作用域。这样,在使用时就会出现一些问题。 下面我们先来举例说明let块级作用域的使用。


也就是说,var声明的变量由于不存在块级作用域所以可以在全局环境中调用,而let声明的变量由于存在块级作用域所以不能在全局环境中调用

非常经典的例子:

//var 
var a=[];
for(var i=0;i<10;i++){
    a[i]=function(){
        console.log(i);
    };
}
a[6](); //10 
 
//let     
var b=[];
for(let j=0;j<10;j++){
    b[j]=function(){
        console.log(j);
    };
}
b[6]();    //6    

let定义的变量j具有块级作用域,作用域是for循环所包含的语句块
这个for循环最终执行了10次,实际上会产生10个互相平行的块级作用域。在每个作用域里面,i的值分别是0,1,2,..,8,9。

当调用b[6]时,执行到console.log(j)这行语句时,解释器会沿着作用域链寻找j的值,结果向上一层就是这10个平行作用域中的第7个,其中j的值为6,于是就打印出了6。

还可以简单的理解成代码块:

代码块就是 { }包起来的代码 ,形成了一个作用域,简称块级作用域

比如:if for while

特点:只能在代码块里面使用

{
            let a=12;
            console.log(a);//打印出 12
        }
        console.log(a);//undefined

2.不存在变量提升

       这里是说使用let不会像使用var一样存在一个变量提升的现象。

       变量提升是什么呢?

   变量提升就是,是把下面的东西提到上面。先使用后声明

//var 情况
var a=1;
console.log(a);
console.log(i);
var i=10;

//let 情况
let b=2;
console.log(b);
console.log(j);
let j=5;


 那么可以以此类推,var定义变量:可以先使用,后声明;而let定义变量:只可先声明,后使用。

注意:这个如果转成es5,就不行。

3.暂时性死区

只要一进入当前作用域,所要使用的变量就已经存在,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。

var tmp = 123;

if (true) {
  tmp = 'abc'; // ReferenceError
  let tmp;
}

也就是说:虽然上面的代码中存在全局变量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后者绑定了块级作用域,所以在let声明变量前,对tmp赋值会报错。此即暂时性死区


注意:ES6规定暂时性死区和不存在变量提升就是为了减少运行时的错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。
暂时性死区就是: 只要块级作用域内存在let,那么他所声明的变量就绑定了这个区域,不再受外部的影响。
暂时性死区即 Temperary Dead Zone,即TDZ。 
注意:暂时性死区也意味着 typeof 不再是一个百分之百安全的操作。  如下:

 if (true) {
      console.log(typeof x);
      let x;
    }

这里如果没有let x,那么typeof x的结果是 undefined,但是如果使用了let x,因为let不存在变量提升,所以这里形成了暂时性死区,即typeof x也是会报错的。。。  从这里可以理解暂时性死区实际上就是这一部分是有问题的 。

4.不允许重复声明

function func (){
    let b=100;
    var b=10;
}
会报错。

总结:

var与let的区别

①let具备块级作用域,var只有函数作用域

②let不允许重复声明

二.let用处

1.i的问题

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <script>
        window.οnlοad=function(){
            var aBtn=document.getElementsByTagName('input');
            for(let i=0; i<aBtn.length; i++){
                aBtn[i].οnclick=function(){
                    console.log(i);//点击那个按钮就打印出它对应的索引
                }
            }
        };
    </script>
</head>
<body>
<input type="button" value="aaa">
<input type="button" value="bbb">
<input type="button" value="ccc">
</body>
</html>

总结:块级作用域其实就是匿名函数立即调用

匿名函数:(function(){
                   ...

                })();


三.const 命令 

const声明一个只读的常量。一旦声明,常量的值就不能改变;声明后 const必须有值

const a=12;
a=15;
console.log(a)//报错 ,定义了不能修改

const a;
a=15;
console.log(a)//报错   声明后const a必须有值

注意:

1.const的作用域与let命令相同:只在声明所在的块级作用域内有效。
2.const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。
3.const不可重复声明常量。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值