资讯专栏INFORMATION COLUMN

es6之let和const

weij / 2416人阅读

摘要:同时又给出了另外两个变量声明的关键字和。声明变量与一样,也是用来声明变量的,但它有着更好的作用域规则。另外一个值得注意的是,不能重复声明变量报错声明变量与不同之处在于,声明的变量只可以在声明时赋值,不可随意修改,否则会导致语法错误。

作用域说明

在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://www.ucloud.cn/yun/84072.html

相关文章

  • ES6 系列 let const

    摘要:块级作用域存在于函数内部块中字符和之间的区域和块级声明用于声明在指定块的作用域之外无法访问的变量。和都是块级声明的一种。值得一提的是声明不允许修改绑定,但允许修改值。这意味着当用声明对象时没有问题报错临时死区临时死区,简写为。 块级作用域的出现 通过 var 声明的变量存在变量提升的特性: if (condition) { var value = 1; } console.lo...

    PascalXie 评论0 收藏0
  • ES6笔记 let && const

    摘要:声明的变量只在其所在的代码块内有效。只要在声明之前使用这些变量,就会报错。在语法上称为暂时性死区有时候,会不经间遇到比较隐蔽的死区,不太容易被发现。不允许重复声明不允许在相同的作用域内声明同一个变量。一旦声明,其值就不能再改变。 let && const let let声明的变量只在其所在的代码块内有效。 { let a = 10; } console.log(a) //R...

    aristark 评论0 收藏0
  • ES6入门对象的扩展

    摘要:循环遍历对象自身的和继承的可枚举属性不含属性。返回一个数组,包含对象自身的所有属性的键名。目前,只有对象方法的简写法可以让引擎确认,定义的是对象的方法。showImg(https://user-gold-cdn.xitu.io/2019/5/21/16ada8456223b0e1); 1. 属性的简洁表示法 在ES6中 允许直接写入变量和函数,作为对象的属性和方法,使得代码的书写更为简洁。...

    RiverLi 评论0 收藏0
  • ES6入门对象的扩展

    摘要:属性的简洁表示法在中允许直接写入变量和函数,作为对象的属性和方法,使得代码的书写更为简洁。循环遍历对象自身的和继承的可枚举属性不含属性。返回一个数组,包含对象自身的所有属性的键名。 showImg(https://segmentfault.com/img/remote/1460000019259004?w=1282&h=1920); 1. 属性的简洁表示法 在ES6中 允许直接写入变量...

    AWang 评论0 收藏0
  • ES6语法 let const

    摘要:以往,在中声明变量的唯一方式是使用关键字。这种行为会阻止变量被访问,除非它们被声明了。因此,将一个对象声明为常量必须非常小心。之中,顶层对象的属性与全局变量是等价的。从现在开始,建议放弃使用,改为使用和。 以往,在 JavaScript 中声明变量的唯一方式是使用关键字 var。为了理解为何添加了 let 和 const,我们先看一个示例,了解使用 var 会带来怎样的麻烦。 var ...

    Xufc 评论0 收藏0

发表评论

0条评论

weij

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<