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