块级作用域
使用let声明块级作用域变量:
let a = 'test'; console.log(a); // test
if (true) { let b = 1; } console.log(b); // error: b is not defined |
由此可见,块级作用域变量作用范围在'{}'内,另外在单个块级作用域内,同一个变量只能声明一次,重复声明JS引擎会抛出异常。
if (true) { let a = 1; let a = 2; } // Uncaught SyntaxError: Identifier 'a' has already been declared |
而在ES5规范中,只有闭包作用域,没有块级作用域设计,那何为闭包作用域呢?
// ES5 if (true) { var a = 1; } console.log(a); // 1
(function foo() { var b = 2; })(); console.log(b); // Uncaught ReferenceError: a is not defined |
使用var还有一个弊端是声明部分会提前,这样的代码非常不规范严谨,典型的场景如下:
if (a in window) { var a = 2; } console.log(a); // 2 |
基于以上分析,在ES6编程中完全可以使用let替代var,几点好处:
· 使用块级作用域
· 摒除var变量带来的副作用
· 在将来多线程开发中,let变量在线程之间不能共享,可保线程安全
除了let,ES6还给我们带来了const关键字,用以声明常量。
const a = 1; a = 2; // Uncaught TypeError: Assignment to constant variable. |
常量的典型使用场景如下:
· 全局环境不能设置变量,务必使用常量
· 所有函数均使用常量
俗话说『存在即合理』,那使用const又能带来什么样的优势呢?
1、运行效率
JS引擎会会优化const,多使用const将一定程度上提高运行效率。这类似于在java中声明一个整型数据变量,使用short会比int、long性能更优,因为前者所占系统空间更小。
2、开发者友好
变量,顾名思义是不可变的量,开发协作者看到常量声明,就明白它是不能被修改的。
3、保证代码的健壮性
在全局作用域内,经常会设计一些系统配置参数,这些参数通常作用于整个系统,一旦被修改就会造成系统bug。在ES5开发模式中,通常有两种实现方式:
· 使用大写字母的变量标识符
· 引入命名空间,减少全局变量的声明
这些做法仅从形式上尽量规避问题,且需要在团队内约定规范,因此不可信任。在引入常量机制后,可彻底避免修改操作,从而保证系统的健壮性。