91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

javascript聲明變量用哪個關鍵字

發布時間:2021-06-09 16:05:46 來源:億速云 閱讀:172 作者:Leah 欄目:web開發

javascript聲明變量用哪個關鍵字?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

在js中,可以使用var、let和const關鍵字聲明。var聲明的變量可以用來保存任何類型的值,范圍是函數作用域;let聲明的變量在{}中使用,變量的作用域限制在塊級域中;const用于修飾常量,聲明位置不限。

聲明變量關鍵字var、let和const

ECMAScript變量是松散類型的,即變量可以用于保存任何類型的數據,每個變量只不過是一個用于保存任意值的命名占位符。

1.var關鍵字

  var聲明的變量可以用來保存任何類型的值(在不初始化的情況下會保存一個特殊值undefined),像其他語言一樣在javascript在定義變量的同時還可以對變量進行賦值,該變量被定義為一個保存所賦值的值的變量,因為javascript是動態語言,在初始化變量的時候不會將它標識為所賦值的數據類型,只是一個簡單的賦值而已。隨后不僅可以改變保存的值,還可以改變值的類型:

var message = "hi";
	message = 100;

1.1.var聲明作用域

  使用var操作符定義的變量會成為包含它的函數的局部變量。比如,使用var在函數內部定義一個變量,就意味這該變量將在函數退出時被銷毀,我覺得這就是所說的垃圾回收:

function test( ) {
		vart message = "hi";	//局部變量
	}
test( );
console.log(message);	//報錯!

  函數調用之后變量會隨機被銷毀,因此最后一行會報錯。不過,在函數定義變量時省略var操作符時可以創建一個全局變量:

function test( )  {
	message = "hi";	//全局變量
}
test( );
console.log(message);	//"hi"

  只要調用一次函數test( )就會定義message這一全局變量,并且可以在函數外部訪問。但是由于在局部作用域中定義的全局變量很難維護,所以一般不推薦這樣做。

1.2.var聲明提升

  使用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

2.let聲明

  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而受影響。這兩個關鍵字聲明的并不是不同類型的變量,他們只是指出變量在相關作用域如何存在。

2.1.暫時性死區

  let與var的另一個重要區別是let聲明的變量不會在作用域中被提升:

//name會提升
console.log(name);	//undefined
var name = 'matt';

//name不會提升
console.log(name);	//ReferenceError:name沒有定義
let name = 'matt';

2.2.全局聲明

  與var不同,使用let在全局作用域中聲明的變量不會成為window對象的屬性(var聲明的變量則會):

var name = 'matt';
console.log(window.name);	//'matt'

let name = 'matt';
console.log(window.name);	//undefined

  不過,let聲明仍然是在全局作用域中發生的,相應變量會在頁面的聲明周期內存續。

2.3.條件聲明

  let的作用域是塊,所以不可能檢查前面是否已經使用let聲明過同名變量,同時也就不可能在沒有聲明的情況下聲明它。使用try/catch或typeof操作符也不能解決,因為條件塊中let聲明的作用域僅限于該塊。為此,對于let這個新的ES6聲明關鍵字不能依賴條件聲明模式。

2.4.for循環中的let聲明

  在使用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

3.const聲明

  const的行為與let基本相同,唯一一個重要區別是它聲明變量時必須同時初始化變量,且嘗試修改const聲明的變量會導致運行錯誤。

  const聲明的限制只適用于它指向的變量的引用。如果const變量引用的是一個對象,那么修改這個對象內部的屬性并不違反const的限制:

const person = { };
person.name = 'matt';

4.使用建議

let和const是ES6中新增的,從客觀上為JavaScript更精確地聲明作用域和語義提供更好的支持。

4.1.不使用var

  限制自己只使用let和const有助于提升代碼質量,因為變量有了明確的作用域、聲明位置,以及不變的值。

4.2.const優先,let次之

  使用const聲明可以讓瀏覽器運行時強制保持變量不變,也可以讓靜態代碼分析工具提前發現不合法的賦值操作。因此,我們應該優先使用const來聲明變量,只有在提前知道未來會有修改時再使用let。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

滨海县| 贡觉县| 临汾市| 麻城市| 阿拉善盟| 罗源县| 弋阳县| 庄浪县| 紫阳县| 昌黎县| 新源县| 临高县| 大理市| 高要市| 鄂尔多斯市| 马鞍山市| 平罗县| 永福县| 原平市| 新和县| 信宜市| 昌都县| 凌源市| 宝兴县| 肃北| 永和县| 南安市| 耒阳市| 新津县| 德保县| 汉源县| 汝南县| 平原县| 确山县| 包头市| 五常市| 木里| 正宁县| 临清市| 利辛县| 永修县|