ECMAScript 6.0(以下简称ES6):是JavaScript语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。
ECMAScript和JavaScript的关系 :前者是后者的规格,后者是前者的一种实现!1996年11月,JavaScript的创造者Netscape公司,决定将JavaScript提交给国际标准化组织ECMA,希望这种语言能够成为国际标准。次年,ECMA发布262号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言称为ECMAScript,这个版本就是1.0版。
ECMAScript的历史:ECMAScript 1.0是1997年发布的,接下来的两年,连续发布了ECMAScript 2.0(1998年6月)和ECMAScript 3.0(1999年12月)2000年,ECMAScript 4.0开始酝酿。这个版本最后没有通过,但是它的大部分内容被ES6继承了。因此,ES6制定的起点其实是2000年。2009年12月,ECMAScript 5.0版正式发布。2011年6月,ECMAscript 5.1版发布。2015年6月,ECMAScript 6正式通过
Babel转码器:Babel是一个广泛使用的ES6转码器,可以将ES6代码转为ES5代码,从而在现有环境执行
// 转码前
input.map(item => item + 1);
// 转码后
input.map(function (item) { return item + 1;})
箭头函数,这个特性还没有得到广泛支持,Babel将其转为普通函数,就能在现有的JavaScript环境执行了
ECMAScript版本生成的五个阶段
Stage 0 - Strawman(展示阶段)
Stage 1 - Proposal(征求意见阶段)
Stage 2 - Draft(草案阶段)
Stage 3 - Candidate(候选人阶段)
Stage 4 - Finished(定案阶段)
let命令
不存在变量提升
暂时性死区
let不允许在相同作用域内,重复声明同一个变量
function () {let a = 10;var a = 1;}
function () {let a = 10;let a = 1;}
块级作用域:
ES5只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景。
第一种场景,内层变量可能会覆盖外层变量。
var tmp = new Date();
function f() {
console.log(tmp);
if (false) {
var tmp = "hello world";
}
}
f(); // undefined
上面代码中,函数f执行后,输出结果为undefined,原因在于变量提升,导致内层的tmp变量覆盖了外层的tmp变量。
第二种场景,用来计数的循环变量泄露为全局变量。
var s = 'hello';
for (var i = 0; i < s.length; i++) {
console.log(s[i]);
}
console.log(i); // 5
上面代码中,变量i只用来控制循环,但是循环结束后,它并没有消失,泄露成了全局变量。
function f1() {let n = 5;
if (true) {
let n = 10;
}
console.log(n); // 5
}