我的ECMAScript 6 学习笔记(一)-let和const变量

      前言:使用ES5很久了,应用的场景越大,越来越发现ES5存在的短板越发明显,ES5没有块级作用域,var声明的变量在全局范围内有效,局部变量可能泄露成为全局变量;内层变量会被外层变量覆盖,给变量的命名带来了麻烦,特别是需要引用多个JS文件的时候尤为明显。然而ES6在2015年已经发布了,解决了ES5的缺陷,最近学习一下,记录一下自己的心得体会。

      学习推荐阮一峰的《ECMAScript 6 入门》一书,网址:              http://es6.ruanyifeng.com/#README

一、let命令

      var特性(1)全局范围内都有效;可能会带来的局部变量可能泄露成为全局变量;内层变量会被外层变量覆盖;(2)可以在声明之前使用,值为undefined。这是一个奇怪的地方,一般使用严格语法的人是不会碰到的。ES6引入了用法与var类似的let命令来声明变量,只在代码块内有效,弥补了var的特性带来的问题。这个在书上的例子说的非常清楚,可以自己阅读,并且自己实践一下就可以自己发现其不同和奥妙。

另外,for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。

可见let命令的出现解决了var存在的内部变量会被外层变量覆盖的问题,极大的解决了变量命名问题也减轻排查bug的工作量。

      只要块级作用域内存在let命令,所声明的变量就绑定这个区域,不会受到外部的影响。ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。这也就是说不会再出现声明之前就可以使用的情形。在使用let命令声明之前,变量是不可用的,在语法上成为“暂时性死区 TDZ”。总之,暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。

综上,let具有的特性为(1)只在区块内有效(2)不允许在声明前调用(3)不允许重复声明。

二、const 命令

      const声明一个只读的常量。一旦声明,常量的值就不能改变。意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值,即只声明不赋值,就会报错。const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。

总结:  ES6 规定暂时性死区和let、const语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。这样的错误在 ES5 是很常见的,现在有了这种规定,避免此类错误就很容易了。

你可能感兴趣的:(我的ECMAScript 6 学习笔记(一)-let和const变量)