记录一下阅读阮老师的《ECMAScript 6入门》,本篇包含前二章的内容:简介、let
和const
命令。
ECMAScript 6简介
ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准。当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015。
ECMAScript和JavaScript的关系是,前者是后者的规格,后者是前者的一种实现(另外的ECMAScript方言还有Jscript和ActionScript)。在日常场合,这两个词是可以互换的。
let命令
基本用法
ES6新增了let
命令,用来声明变量。它的用法类似于var
,但是所声明的变量,只在let
命令所在的代码块内有效。
1 | { |
不存在变量提升
let
不像var
那样会发生“变量提升”现象。所以,变量一定要在声明后使用,否则报错。
1 | console.log(foo); // 输出undefined |
暂时性死区
只要块级作用域内存在let
命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
1 | var tmp = 123; |
不允许重复声明
let
不允许在相同作用域内,重复声明同一个变量。
1 | // 报错 |
块级作用域
ES6的块级作用域
let
实际上为JavaScript新增了块级作用域。ES6允许块级作用域的任意嵌套。
1 | function f1() { |
块级作用域与函数声明
ES6引入了块级作用域,明确允许在块级作用域之中声明函数。
1 | // ES6严格模式 |
另外,还有一个需要注意的地方。ES6的块级作用域允许声明函数的规则,只在使用大括号的情况下成立,如果没有使用大括号,就会报错。
1 | // 不报错 |
const命令
const
声明一个只读的常量。一旦声明,常量的值就不能改变并且必须立即初始化,不能留到以后赋值。const
的作用域与let
命令相同:只在声明所在的块级作用域内有效。const
命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。const
声明的常量,也与let
一样不可重复声明。
对于复合类型的变量,变量名不指向数据,而是指向数据所在的地址。const
命令只是保证变量名指向的地址不变,并不保证该地址的数据不变,所以将一个对象声明为常量必须非常小心。
1 | const PI = 3.1415; |
全局对象的属性
ES6规定,为了保持兼容性,var
命令和function
命令声明的全局变量,依旧是全局对象的属性;另一方面规定,let
命令、const
命令、class
命令声明的全局变量,不属于全局对象的属性。也就是说,从ES6开始,全局变量将逐步与全局对象的属性脱钩。
1 | var a = 1; |