開始學習ES6
,這里是第一篇筆記鳖轰,首先記錄了2個基礎(chǔ)的let
和const
關(guān)鍵字。
let
let 關(guān)鍵字帶來了塊級作用域扶镀。
在es6
之前蕴侣,我們只有全局作用域和函數(shù)作用域,而let
的出現(xiàn)宣示著塊級作用域的到來臭觉,我覺得這是JavaScript
在逐漸變得嚴謹起來昆雀,并向我們?nèi)映隽艘幌盗械摹罢Z法糖”。
// 傳統(tǒng)的 var 關(guān)鍵字
var a = [];
for(var i = 0; i < 6; i++){
a[i] = function(){
return i;
}
}
a[3](); // 6
a[5](); // 6
// ES6 新增的 let 關(guān)鍵字
var b = [];
for(let j = 0; j < 6; j++){
b[j] = function(){
return j;
}
}
b[3](); // 3
b[5](); // 5
let 不存在變量提升
var
關(guān)鍵字在聲明變量時蝠筑,會有一種“變量提升”(預(yù)解析)機制(提醒自己一下:function
函數(shù)聲明也一樣狞膘,優(yōu)先級要比變量提升要高,函數(shù)表達式等同變量聲明)菱肖。然而客冈,let
卻不存在變量提升機制:
function foo(){
a = 6;
console.log(a);
let a;
}
foo(); // Uncaught ReferenceError: a is not defined
暫時性死區(qū)(temporal dead zone,簡稱TDZ)
其實稳强,不止變量提升,let
或const
聲明的變量有更嚴格的設(shè)置和悦,let
或const
聲明的變量會綁定所在塊級作用域退疫。假如說,我用let
或const
聲明了一個變量variable1
鸽素,那么在作用域內(nèi)褒繁,在聲明語句前引用該變量都會導(dǎo)致錯誤,即使該變量在外部有聲明或賦值馍忽。
var variable1 = "kawi";
function foo(){
typeof(variable1);
let variable1;
}
foo(); // Uncaught ReferenceError: variable1 is not defined
上面例子中代碼與變量提升的非常相似棒坏,但要解釋的東西完全不一樣。
禁止重復(fù)聲明
以往在編寫JavaScript
代碼時遭笋,var
關(guān)鍵字過于靈活的特性以至于我們可能在某些業(yè)務(wù)場景中不嚴謹?shù)闹貜?fù)定義某個變量坝冕。例如:
for(var i=0; i<3;){
i++
}
console.log(i); // 3
for(var i=0; i<6;){
i++
}
console.log(i); // 6
前面已經(jīng)領(lǐng)會過let
和const
有多講究嚴謹,重復(fù)用它們定義一個變量瓦呼,是會導(dǎo)致錯誤的:
function foo(param){
let param = 1; // Uncaught SyntaxError: Identifier 'param' has already been declared
}
function foo(){
let param = 1;
var param = 2; // Uncaught SyntaxError: Identifier 'param' has already been declared
}
塊級作用域的嵌套
像下面這樣的嵌套是可以的:
{
let a = 1;
{
let a = 2;
console.log(a); // 2
}
}
const
const
關(guān)鍵字用于定義恒量喂窟,也就是不變的值。
const 是可讀的,不可寫的磨澡。
const a = 1;
a = 2; // Uncaught TypeError: Assignment to constant variable.
const 聲明變量時一定要賦值碗啄。
const a; // Uncaught SyntaxError: Missing initializer in const declaration
a = 2;
const 聲明變量,并賦值引用類型
當我們用const
定義一個變量稳摄,并賦值一個引用類型對象稚字,這個對象是可以修改的。例如:
const arr = [];
arr[1] = 1;
console.log(arr.length); // 2
原因厦酬,指針嘛胆描,指針不變就OK啦!
(PS:在ES6
中一共有6個關(guān)鍵字:var
弃锐,function
袄友,let
,const
霹菊,import
剧蚣,class
)