ECMA2015(也称es6),在原先javascript语法基础上新增语法特征,浏览器对es6的语法支持还不够,需要借助babel解析工具(可在gulp的配置文件gulpfile.js中配置针对bable的命令);
关于作用域:除了全局作用域和函数内作用域,es6新增了块级作用域,即用{}包裹的代码块。块级作用域:内层变量和外层变量的值互不影响。内层无法读取外层,外层无法读取内层。
{
console.log(b); //报错,
{let a=12;let b=0;}
console.log(a) //报错,
}
ES6允许在块级作用域内定义函数(但在老的浏览器中还是报错,所以该特性还是尽量不用);
let:es6中声明变量新增的方式
特性:
①声明仅在所在的代码区块内有效;(es6新增块级作用域)
{let a=12} ;
alert(a); //报错,a is not define
该特性可用于在for循环中声明变量
for(let i=0;i<10;i++){} //变量i仅在循环体内部生效。
console.log(i) //i is not define
②不存在变量提升;
alert(a) //undefined
alert(b)// 报错, b is not defined
var a=12;
let b=11;
③暂时性死区;
在一段代码区块内,使用let或const声明变量,在变量声明前对变量的使用都会报错。即使在代码块外部有同名的全局变量。
var abc=100;
{
abc=23; //referenceError 声明前使用,报错
let abc; //当let或const在代码块内声明了,则在代码块中形成了封闭的区域,在该封闭区域内变量声明前的使用都会报错。
console.log(abc); //undefined
abc=10;
console.log(abc)//10
}
const命令:es6新增声明常量方式;
特性:
①声明时就需要赋值,否则报错;常量一旦声明不可以重新赋值,否则报错;
②在所在的代码区块内有效;(同let);
③不存在变量提升;
④存在暂时性死区;
⑤声明复杂型常量时,const仅仅保存了地址,常量中的属性还是可以变更的;
例如:const obj={};
const arr=[];
arr.push(12);
arr.length=0;
arr = ['hello'] //报错
obj.a=1;
console.log(obj.a) // 1
obj={'b':2} //报错
(可冻结对象,冻结后对象属性将不能修改;Object,freeze({'需要冻结的对象参数'}));
REPL:nodejs中的交互运行环境,可执行javascript语句。
全局对象;原有javascript的全局对象是window,给全局对象的属性赋值相当于声明一个全局变量。
在ES6中,let和const命令声明的变量和常量不再是全局对象的属性。
var a=1;
let b=2;
window.a //1
window.b // undefined