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