一.var 聲明與變量提升機(jī)制
在JavaScript中使用var定義一個變量,無論是定義在全局作用域函數(shù)函數(shù)的局部作用域中,都會被提升到其作用域的頂部,這也是JavaScript定義變量的一個令人困惑的地方。由于es5沒有像其它類C語言一樣的塊級作用域,因此es6增加了let定義變量,用來創(chuàng)建塊級作用域。
我們來看一個var定義變量的示例:
function setName(){ if(condition){ var name = 'loho'; console.log(name); }else{ console.log(name); }}var student = 'eveningwater';setName();以上代碼可以理解成如下:
var student;function setName(){ var name; if(condition){ name = 'loho'; console.log(name);//loho }else{ console.log(name);//undefined }}student = 'eveningwater';setName();二.塊級聲明
塊級聲明意在指定一個塊級作用域,使得塊級作用域中所定義的變量無法再全局被訪問到,塊級作用域也被稱為詞法作用域。
塊級作用域存在于兩個地方:
1.let 聲明
let聲明同var聲明用法一致,唯一的區(qū)別在于,let聲明將變量限制在一個塊內(nèi),這樣就形成了一個塊級作用域,因此也就不會存在變量的提升了。
例如前面的示例,我們可以寫成如下:
let stundent = 'eveningwater';function setName(){ if(condition){ let name = 'loho'; console.log(name);//loho }else{ //如果條件為false執(zhí)行到這里 console.log(name);//不返回值 }}setName();2.禁止重聲明
在使用let定義變量之前如果已經(jīng)聲明了相同的變量,就會報(bào)錯。因此不能重復(fù)聲明變量。如以下示例:
var name = 'eveningwater';//報(bào)錯,重復(fù)聲明let name = 'loho';
當(dāng)然這兩個變量必須是在同一個作用域中,如果是不同作用域中,則不會報(bào)錯。但有可能會遮蔽第一次聲明的變量。如以下示例:
var name = 'eveningwater';if(condition){ //不會報(bào)錯 let name = 'loho';}3.const聲明
使用const標(biāo)識符所聲明的變量必須要初始化,因此這個聲明的就是一個常量。如下例:
const name='eveningwater';//正確const name;//錯誤,未初始化
const聲明同let聲明一樣,也是創(chuàng)建了一個塊級作用域,在這個塊級作用域之外是無法訪問到所聲明的變量的。換句話說,就是const所聲明的變量不會有變量提升機(jī)制。如下例:
if(condition){ const name = 'eveningwater'; console.log(name);//'eveningwater'}//錯誤console.log(name);同樣的const也不能重復(fù)聲明,如下例:
var name = 'eveningwater';//錯誤,不能重復(fù)聲明const name = 'loho';
新聞熱點(diǎn)
疑難解答
圖片精選