您好,登錄后才能下訂單哦!
javascript聲明變量用哪個關鍵字?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
在js中,可以使用var、let和const關鍵字聲明。var聲明的變量可以用來保存任何類型的值,范圍是函數作用域;let聲明的變量在{}中使用,變量的作用域限制在塊級域中;const用于修飾常量,聲明位置不限。
ECMAScript變量是松散類型的,即變量可以用于保存任何類型的數據,每個變量只不過是一個用于保存任意值的命名占位符。
var聲明的變量可以用來保存任何類型的值(在不初始化的情況下會保存一個特殊值undefined),像其他語言一樣在javascript在定義變量的同時還可以對變量進行賦值,該變量被定義為一個保存所賦值的值的變量,因為javascript是動態語言,在初始化變量的時候不會將它標識為所賦值的數據類型,只是一個簡單的賦值而已。隨后不僅可以改變保存的值,還可以改變值的類型:
var message = "hi"; message = 100;
使用var操作符定義的變量會成為包含它的函數的局部變量。比如,使用var在函數內部定義一個變量,就意味這該變量將在函數退出時被銷毀,我覺得這就是所說的垃圾回收:
function test( ) { vart message = "hi"; //局部變量 } test( ); console.log(message); //報錯!
函數調用之后變量會隨機被銷毀,因此最后一行會報錯。不過,在函數定義變量時省略var操作符時可以創建一個全局變量:
function test( ) { message = "hi"; //全局變量 } test( ); console.log(message); //"hi"
只要調用一次函數test( )就會定義message這一全局變量,并且可以在函數外部訪問。但是由于在局部作用域中定義的全局變量很難維護,所以一般不推薦這樣做。
使用var關鍵字聲明的變量會自動提升函數作用域頂部,即所謂的“提升”(hoist),也就是把所有變量聲明都拉到函數作用域的頂部:
function fool( ) { console.log(age); var age = 28; } fool( ); //undefined
這里是不會報錯的,而是顯示undefined,ECMAScript在運行是會把它看成等價于如下的代碼:
function fool( ) { var age; console.log(age); age = 28; } fool( ); //undefined
let跟var的作用差不多,但有著非常重要的區別。最明顯的區別是let聲明的范圍是塊作用域,而var聲明的范圍是函數作用域:
if (true) { let age = 26; console.log(age); //26 } console.log(age); //ReferceError:age沒有定義
age變量的作用域僅限于該塊內部,所以不能在if塊外部被引用。塊作用域是函數作用域的子集,所以適用于var的作用域限制也同樣適用于let。
let也不允許同一塊作用域中出現冗余聲明(var可以):
var name; var name; let age; let age; //SyntaxError;標識符age已經聲明過了
此外,對聲明冗余報錯不會因混用var和let而受影響。這兩個關鍵字聲明的并不是不同類型的變量,他們只是指出變量在相關作用域如何存在。
let與var的另一個重要區別是let聲明的變量不會在作用域中被提升:
//name會提升 console.log(name); //undefined var name = 'matt'; //name不會提升 console.log(name); //ReferenceError:name沒有定義 let name = 'matt';
與var不同,使用let在全局作用域中聲明的變量不會成為window對象的屬性(var聲明的變量則會):
var name = 'matt'; console.log(window.name); //'matt' let name = 'matt'; console.log(window.name); //undefined
不過,let聲明仍然是在全局作用域中發生的,相應變量會在頁面的聲明周期內存續。
let的作用域是塊,所以不可能檢查前面是否已經使用let聲明過同名變量,同時也就不可能在沒有聲明的情況下聲明它。使用try/catch或typeof操作符也不能解決,因為條件塊中let聲明的作用域僅限于該塊。為此,對于let這個新的ES6聲明關鍵字不能依賴條件聲明模式。
在使用var的時候,最常見的問題就是對迭代變量的奇特聲明和修改:
for(var i = 0; i < 5; ++i) { setTimeout( () => console.log(i) ,0) } //你可能以為會輸出0、1、2、3、4 //實際上輸出的是5、5、5、5、5
在退出循環的時候迭代變量保存的是導致循環退出的值:5。在之后執行setTimeout超時邏輯時,所以i都是同一個變量,因而最終輸出的都是同一個值。
使用let聲明迭代變量時,JavaScript引擎在后臺會為每個迭代循環聲明一個新的迭代變量,每個setTimeout引用的都是不同的變量實例:
for(let i = 0; i < 5; ++i) { setTimeout( () => console.log(i) ,0) } //會輸出0、1、2、3、4
const的行為與let基本相同,唯一一個重要區別是它聲明變量時必須同時初始化變量,且嘗試修改const聲明的變量會導致運行錯誤。
const聲明的限制只適用于它指向的變量的引用。如果const變量引用的是一個對象,那么修改這個對象內部的屬性并不違反const的限制:
const person = { }; person.name = 'matt';
let和const是ES6中新增的,從客觀上為JavaScript更精確地聲明作用域和語義提供更好的支持。
限制自己只使用let和const有助于提升代碼質量,因為變量有了明確的作用域、聲明位置,以及不變的值。
使用const聲明可以讓瀏覽器運行時強制保持變量不變,也可以讓靜態代碼分析工具提前發現不合法的賦值操作。因此,我們應該優先使用const來聲明變量,只有在提前知道未來會有修改時再使用let。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。