我的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 是很常见的,现在有了这种规定,避免此类错误就很容易了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • let 命令 块级作用域 const 命令 顶层对象的属性 global 对象 let 命令 基本用法 ES6 新...
    嘉奇呦_nice阅读 1,654评论 0 2
  • let 和 const 命令 let 命令 块级作用域 const 命令 顶层对象的属性 gl...
    安小明阅读 1,000评论 0 0
  • let 命令 块级作用域 const 命令 顶层对象的属性 global 对象 let 命令 基本用法 ES6 新...
    卞卞村长L阅读 631评论 0 0
  • let 命令 1.基本用法 let 是ES6新增的命令,用于声明变量。用法类似于var,但是声明的变量只在let所...
    站在大神的肩膀上看世界阅读 360评论 0 3
  • 第一章 窗外的雨滴答滴答的落在窗台上,打断了正在创作的云落。云落的思想被雨滴所吸引,不知不觉间已走到阳台,望着外...
    辰熙啊阅读 170评论 0 0