es6之let和const

作用域申明

在es6之前我们我们声明一个变量用var如:

var a = 1;
var arr = [1,2,3];
...

es6之前呢javascript没有块级作用域,如何来明白呢:就是在代码块里声明的变量会“变量提拔”至就近的函数作用域顶部或全局当中。如我们熟习的for轮回:

for( var i=0; i<10; i++){
    console.log(i)
}
# 提拔到全局,相当于
var i;
for(i=0; i<10; i++){
    console.log(i)
}

function test (){
    .....
    for( var i=0; i<10; i++){
        console.log(i)
    }
}
# 提拔到函数作用域顶部,相当于
function test (){
    var i;
    .....
    for(i=0; i<10; i++){
        console.log(i)
    }
}

在es6中给出了块级作用域的观点:{}所见谅的代码块就是一个作用域。同时又给出了别的两个变量声明的关键字:let和const。

let声明变量

let与var一样,也是用来声明变量的,但它有着更好的作用域划定规矩。来看几个栗子:

function test1(){
    for(var i=1;i<3;i++){
        console.log(i);
    }
    console.log(i); // 3
}
test1();

function test2(){
    for(let i=1;i<3;i++){
        console.log(i);
    }
    console.log(i); // 报错了
}
test2();

实行test1的时刻,因为变量提拔了所已表面的log能找到i,而test2用的let声明的变量,在for轮回的代码块内见效,for轮回完毕后变量被烧毁,被渣滓接纳机制接纳。所以会报错。

let别的一个值得注意的是,不能反复声明变量:

let a = 1;
let a = 3; // 报错 Uncaught SyntaxError: Identifier 'a' has already been declared

const声明变量

与let不同之处在于,const声明的变量只能够在声明时赋值,不可随便修正,不然会致使语法毛病。

const PI=3.1415926; //ok

const G;
G = 9.8; // SyntaxError: Missing initializer in const declaration

const MODIFY = 1;
MODIFY = 2; // TypeError: Assignment to constant variable.

上面能够看到声明的时刻必需赋值不然报答没有初始化的毛病,已赋值的常量再次赋值也会报错。
我们怎样明白下面这段代码呢

function test(){
  const obj={
    name: 'lilei'
  }
  obj.age=20;
  console.log(obj); // {name: "lilei", age: 20}
}
test()

const声明的变量不是不能修正吗,这里怎样能够修正胜利呢,我们晓得对象是援用范例,我们修正的是值,而不是其援用,而const声明的对象范例的变量保留的是其援用,所以是不抵牾的。

    原文作者:虎子哥
    原文地址: https://segmentfault.com/a/1190000010224633
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞