es6中的新的变量与常量以及与传统定义的区别

  es6明确规定,如果区块中存在let和const命令,则这个区块对这些命令声明的变量从一开始就形成封闭作用域。再要在声明之前就使用这些变量,就会报错。

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

  let不允许在相同作用域内重复声明同一个变量。let实际上为js新增了块级作用域。es6允许块级作用域任意嵌套。新框架中到处所在的双{}大概用的就是这块功能。块级作用域的出线,实际上使得获得广泛应用的立即执行匿名函数(IIFE)不再必要了。(function(){}());另外,ES6也规定,函数本身的作用域在其所在的块级作用域内。

  对于复合类型的变量,变量名不指向数据,而是指向数据所在的地址。const命令只是保证变量名指向的地址不变,并不保证该地址的数据不变,所以将一个对象声明为常亮必须非常小心。数组可以通过push等方法改变,对象可以通过属性来更改。 如果真的想将对象冻结,应该使用Object.freeze方法。const foo=Object.freeze({});除了将对象本身冻结,对象的属性也应该冻结。遍历对象,类型是对象就冻结。

  const声明的常量只在当前代码块有效。如果想设置跨模块的常量,可以采用import的写法。

  在传统JS中全局对象的属性赋值与全局变量的赋值,是同一件事。这种规定被视为js语言的一大问题,因为很容易不知不觉就创建了全局变量。ES6为了改变这一点,一方面规定,var命令和function命令声明的全局变量依旧是全局对象的属性;另一方面规定,let命令、const命令和class命令声明的全局变量不属于全局对象的属性。

 

posted @ 2018-07-02 18:05  艾路  阅读(711)  评论(0编辑  收藏  举报