首頁 > web前端 > 前端問答 > javascript中宣告變數的關鍵字是什麼

javascript中宣告變數的關鍵字是什麼

青灯夜游
發布: 2023-01-06 11:17:06
原創
9864 人瀏覽過

javascript中宣告變數的關鍵字是var、let和const。 var宣告的變數可以用來保存任何型別的值,宣告的範圍是函數作用域;let宣告的範圍是區塊作用域;而const宣告變數時必須同時初始化變數,且初始化後值不可再修改。

javascript中宣告變數的關鍵字是什麼

本教學操作環境:windows7系統、ECMAScript 6版、Dell G3電腦。

聲明變數關鍵字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
登入後複製

【相关推荐:javascript学习教程

3.const声明

const的行为与let基本相同,唯一一个重要区别是它声明变量时必须同时初始化变量,且尝试修改const声明的变量会导致运行错误。

const声明的限制只适用于它指向的变量的引用。如果const变量引用的是一个对象,那么修改这个对象内部的属性并不违反const的限制:

const person = { };
person.name = &#39;matt&#39;;
登入後複製

4.使用建议

let和const是ES6中新增的,从客观上为JavaScript更精确地声明作用域和语义提供更好的支持。

4.1.不使用var

    限制自己只使用let和const有助于提升代码质量,因为变量有了明确的作用域、声明位置,以及不变的值。

4.2.const优先,let次之

    使用const声明可以让浏览器运行时强制保持变量不变,也可以让静态代码分析工具提前发现不合法的赋值操作。因此,我们应该优先使用const来声明变量,只有在提前知道未来会有修改时再使用let。

更多编程相关知识,请访问:编程入门!!

以上是javascript中宣告變數的關鍵字是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板