var聲明與變數提升 使用var關鍵字聲明的變數,無論其實際聲明位置在何處,都會被視為聲明於所在函數的頂部(如果聲明不在任意函數內,則視為在全局作用域的頂部)。這就是所謂的變數提升。 塊級聲明 塊級聲明就是讓所聲明的變數在指定塊的作用域外無法被訪問。塊級作用域在如下情況被創建: 1. 一個函數內部 ...
var聲明與變數提升
使用var關鍵字聲明的變數,無論其實際聲明位置在何處,都會被視為聲明於所在函數的頂部(如果聲明不在任意函數內,則視為在全局作用域的頂部)。這就是所謂的變數提升。
塊級聲明
塊級聲明就是讓所聲明的變數在指定塊的作用域外無法被訪問。塊級作用域在如下情況被創建:
- 一個函數內部
- 在一個代碼塊內部
let聲明
let聲明的語法和var的語法一致。基本可以使用let替換var,但會將變數的作用域限制在當前代碼塊中。let聲明不會被提升到當前代碼塊的頂部。
禁止重覆聲明
如果一個標識符在代碼內部被定義,那麼在此代碼塊內部使用同一個標識符進行let聲明就會導致拋出錯誤。
var count = 30;
let count = 40;//語法錯誤
如果在嵌套作用域內使用let聲明一個同名的新變數,則不會拋出錯誤。
var count = 30;
if(condition){
let count = 40;//不會拋出錯誤
}
常量聲明
使用const進行常量的聲明,它們的值在被設置完成之後就不能再被改變。正因為如此,所有的const變數都需要在聲明時進行初始化
const MAX_ITEMS = 30;
const NAME;//語法錯誤
常量與let聲明都是塊級聲明。與let聲明類似,const聲明會在同一作用域內定義一個已有變數時會刨除錯誤,無論改變了是var聲明還是let聲明。
var message = "HELLO";
let age = 25;
//二者都會拋出錯誤
const message = "Goodbye";
const age = 23;
let與const一個重大區別是:試圖對之前用const聲明的常量進行賦值會拋出錯誤,無論在嚴格模式還是非嚴格模式下
const maxItems = 30;
maxItems = 35;//拋出錯誤
但是如果const定義的常量如果是一個對象,它所包含的值是可以修改的。
var const person = {
name = "cc"
}
//正常工作
person.name = "dd";
//拋出錯誤
person = {
name = "aa";
}
全局塊級綁定
let和const不同於var的另一個方面是在全局作用域上的表現。當在全局作用域上使用var時,它會創建一個新的全局變數,併成為全局對象(在瀏覽器中是window)的一個屬性。這意味著使用var可能會無意覆蓋一個已有的全局屬性。
var RegExp = "hello";
console.log(window.RegExp);//"hello"
var ncz = "hi";
console.log(window.ncz);
在全局作用域上使用let或const,雖然會在全局作用域上創建新的綁定,但不會有任何屬性被添加到全局對象上。這也就意味著你不能用let或const來覆蓋一個全局變數,你只能將其屏蔽。
let RegExp = "hello";
console.log(window.RegExp);//function
console.log(window.RegExp === RegExp);//false
const ncz = "hi";
console.log(ncz);//hi
console.log("ncz" in window);//false
隨著更多的開發者遷移到es6上,一種替代方案變得更為流行,那就是在預設情況下使用const,並且只有在知道變數值需要被更改的情況下才使用let。其理論依據是大部分變數在初始化之後都不應當被修改,因為預期外的改動是bug的源頭之一。