ECMAScript 6.0简称ES6,是JavaScript语言的下一代标准。ECMAScript和JavaScript的关系是:ECMAScript是JavaScript的规格,JavaScript是ECMAScript的一种实现。
let命令
- ES6新增了let命令,用于声明变量,与var的作用相似,let与var的不同之处在于通过let声明的变量只在let命令所在的代码块中有效。for循环的计数器就适合使用let命令。
- let不会像var那样存在“声明提前”的特点,使用let命令定义变量的时候,变量一定要先声明后使用,否则就会报错。ES6中规定,如果区块中存在let和const命令,那么这个区块对于这些命令声明的变量从一开始就形成了封闭作用域。凡是在声明之前使用变量就会报错。在代码块里面,使用let命令声明变量之前,变量都是不可用的。
- 在ES6中规定暂时性死区和let、const语句不会出现变量提升,这样做的主要目的是为了减少运行时错误,防止在变量声明之前使用变量,发生意外的错误。
ES6之前的JavaScript规范中只有全局作用域和函数作用域这两种作用域,在ES6标准中新添加了块级作用域。在原来的规定中这样的做法可能会使内层的变量覆盖外层的变量,程序示例:
var tmp=new Date();
function f(){
console.log(tmp);
if(false){
var tmp="hello World";
}
}
f();
第二种不合理的场景就是用于循环计数的变量会泄露,编程全局变量,程序示例:
for(var i=0;i<10;i++){
console.log(i); //输出0,1,2,3,4,5,6,7,8,9
}
console.log(i); //输出 10
在这个程序中,即便是循环执行完毕了,还能获取到变量i的值,就说明计数变量在循环执行完毕之后泄露变成了全局变量,并不会像其他的语言那样,循环代码执行完毕之后就将计数变量销毁。
块级作用域
ES6引入了块级作用域之后,明确声明了允许在块级作用域中声明函数。在块级作用域中,函数的声明语句行为类似于let,在块级作用域之外是不可用的。
但是ES6中这样的规定并不会被浏览器严格的执行,ES6在附录里面规定允许浏览器有自己的行为方式:
- 允许在块级作用域中声明函数
- 声明函数类似于声明var,会提升到全局作用域或者是函数作用域的头部。
- 函数声明还会提升到所在的块级作用域的头部。
const命令
const可以声明一个只读的常量,常量一旦被声明,常量的值就是不可以被改变的,任何企图改变常量的值的行为都会引发程序报错,在声明常量的时候必须在声明的时候就进行初始化,不能留在以后赋值,否则会报错。
const的作用域与let命令相同,都只在声明所在的块级作用域中有效。const命令声明常量也不存在声明提前,同样也存在暂时性死区,只能在声明常量之后调用常量的值,常量是不可以重复声明,否则也会报错。声明的常量名不是指向数据的而是指向数据所在的地址的,const命令只能保证变量名指向的地址保持不变,但是不能保证该地址里面的数据不变。
全局对象的属性
在浏览器中全局环境指的是window对象,在Node.js中的全局对象指的是global对象。在ES5中全局对象的属性和全局变量是等价的。在ES5中未声明的全局变量,会自动成为全局变量window的属性。在ES6中做出了两个规定:
- 兼容ES5,var和function声明的全局变量依然是全局对象的属性
- let、const和class声明的全局变量不属于全局对象的属性。
网友评论