ECMAScript 6 笔记(1)- let

原创 乘风逐月 随笔 ES6 469阅读 2018-08-14 11:12:12 举报

阅读原文: 阮一峰:ECMAScript 6 入门

关于 ECMAScript 的历史

1996年11月,JavaScript 的创造者 Netscape 公司,将 JavaScript 提交给欧洲计算机制造商协会(ECMA),希望这种语言能够成为国际标准。

次年,ECMA 发布262号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将语言称为 ECMAScript,这就是 1.0 版。(之所以不叫 JavaScript,一是因为商标,Java 是 Sun 公司的商标,根据授权协议,只有 Netscape 公司可以合法使用 JavaScript 这个名字,且 JavaScript 本身已经被 Netscape 公司注册为商标。二是因为想体现这门语言的制定者是 ECMA ,不是 Netscape,这样有利于保证这门语言的开放性和中立性。 ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现。日常场合,两个词可以互换。)

1998年6月 ECMAScript 2.0 发布。

1999年12月 ECMAScript 3.0 发布,3.0 版是一个巨大的成功,在业界得到广泛支持,成为通行标准,奠定了 JavaScript 语言的基础,以后的版本完全继承。今天初学者一开始学习 JavaScript ,其实就是在学 3.0 的语法。

2000年, ECMAScript 4.0 开始酝酿,但这版没有通过,因为这个版本太激进了,对 ES3 做了彻底升级,导致标准委员会的一些成员不愿意接受。但它的大部分内容被 ES6 继承了。

2007 年 10 月,ECMAScript 4.0 版草案发布。

2008 年 7 月,由于对于下一个版本应该包括哪些功能,各方分歧太大,争论过于激烈,ECMA 开会决定,中止 ECMAScript 4.0 的开发,将其中涉及现有功能改善的一小部分,发布为 ECMAScript 3.1,会后不久,ECMAScript 3.1 就改名为 ECMAScript 5。

2009 年 12 月,ECMAScript 5.0 版正式发布。

2011 年 6 月,ECMAscript 5.1 版发布,并且成为 ISO 国际标准(ISO/IEC 16262:2011)。

2013 年 3 月,ECMAScript 6 草案冻结,不再添加新功能。新的功能设想将被放到 ECMAScript 7。

2013 年 12 月,ECMAScript 6 草案发布。然后是 12 个月的讨论期,听取各方反馈。

2015 年 6 月,ECMAScript 6 正式通过,成为国际标准。

一、 let 命令

1.基本用法

let 命令用于声明变量,类似 var ,但是 let 声明的变量,只能在 let 命令所在的代码块内有效。
例如:

2. let 在 for 循环中的使用

在这个例子中,i 由 var 声明,在全局范围有效,a 的所有组员里面的 i 都是指向同一个 i,导致所有组员运行输出的都是最后一轮的 i 的值。

这个例子中, i 由 let 声明,当前的 i 只在本轮循环有效,所有每次循环的 i 其实都是一个新的变量。
注: 每轮循环的 i 都是重新声明的,JavaScript 引擎内部会记住上一轮循环的值,初始化本轮的 i 时,就在上一轮循环的基础上进行计算。

3. for 循环的特别之处

在 for 循环中,设置循环变量的那部分是一个父作用域,而循环内部是一个单独的子作用域。
例如:

4. 不存在变量提升

var 命令会发生 “变量提升” 现象,即变量可以在声明之前使用,值为 undefined。 let 命令改变了语法行为,它所声明的变量一定要在声明后使用,否则会报错。

5. 暂时性死区

ES6规定,如果区块中存在 let 和 const 命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前使用这些变量,就会报错。这在语法上称为 “暂时性死区”。

(1)“暂时性死区” 对 typeof 的影响

“暂时性死区” 也意味着 typeof 不再是一个百分之一百安全的操作。

上例中 x 由 let 声明,所有在声明之前,都属于 x 的 “死区” ,只要用到变量就会报错。作为比较,如果一个变量没有被声明,使用 typeof 反而不会报错。

(2)隐藏的“死区”

还有,例如:

总结: “暂时性死区” 的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但不可获取,只有等到声明的那一行代码出现,才可以获取和使用。

6. 不允许重复声明

let 不允许在相同作用域内,重复声明同一个变量。

评论 ( 0 )
最新评论
暂无评论

赶紧努力消灭 0 回复