搞懂JavaScript全局變量與局部變量,看這篇文章就夠了

目錄

1.什麼是全局變量和局部變量

2.全局變量和局部變量的聲明

2.1 全局變量的聲明

2.2 局部變量的聲明

 3.全局變量和局部變量一些常見問題

   3.1全局變量跟局部變量重名

3.2 零散變量的問題

3.3. 變量釋放問題

總結:


 

1.什麼是全局變量和局部變量

全局變量:常常定義在函數外部,擁有全局作用域,即在 JavaScript 代碼的任何地方都可以訪問。

局部變量:定義在函數內部,只能在函數中使用的變量,作用範圍是從函數開始到結尾,即在{}裏。

在函數內聲明的變量只在函數體內有定義,即爲局部變量,其作用域是局部性的。需要注意的是,在函數體內聲明局部變量時,如果不使用 var 關鍵字,則將聲明全局變量。

<script>
		var str1 = "hello1"; //定義一個全局變量
		function a() {
			var str2 = "hello2"; //定義一個局部變量
			str3 = "hello3"; //定義一個全局變量
		}
</script>

 此處str1和str3是全局變量,str2爲局部變量。

2.全局變量和局部變量的聲明

2.1 全局變量的聲明

在js中全局變量聲明方式分爲顯示聲明和隱式聲明

第一種聲明方式:使用var關鍵字+變量名在函數外部聲明就是全局變量,例如:

var bianliang = "全局變量";

第二種聲明方式:沒有使用var關鍵字聲明,直接給變量名賦值,不管是在函數內部還是外部都是全局變量,例如:

<script>
		text = "全局變量";

		function bl() {
			text1 = "我也是全局變量";
			var text2 = "我是局部變量";
			console.log(text2); //局部變量只能在函數中使用
		}

		bl() //結果:我是局部變量

		console.log(text); //結果:全局變量
		console.log(text1); //結果:我也是全局變量
		//console.log(text2); //局部變量,在函數外使用會報錯
</script>

第三種聲明方式: 使用window全局對象來聲明,全局對象的屬性對應也是全局變量,例如:

window.test3 = 'window全局對象聲明全局變量';

console.log(test3);//結果:window全局對象聲明全局變量

 

2.2 局部變量的聲明

聲明局部變量一定要使用var關鍵字,使用var關鍵字聲明變量時,變量會自動添加到距離最近的可用環境中。如果沒有寫var, 變量就會暴露在全局上下文中, 成爲全局變量。如果變量在未聲明的情況下被初始化,該變量會自動添加到全局環境。

<script>
		function bl() {
			text1 = "我也是全局變量";//沒有使用var 爲全局變量
			var text2 = "我是局部變量";
			console.log(text2); //局部變量只能在函數中使用
		}
</script>

 3.全局變量和局部變量一些常見問題

   3.1全局變量跟局部變量重名

當全局變量跟局部變量重名時,局部變量的scope會覆蓋掉全局變量的scope,當離開局部變量的scope後,又重回到全局變量的scope。

<script>
		var str = "我是全局變量";

		function b() {
			var str = "我是局部變量";
			console.log(str); //結果:我是局部變量
		}
		b();
		console.log(str);//結果:我是全局變量
</script>

 當全局變量遇上局部變量時,怎樣使用全局變量呢?用window.globalVariableName。

<script>
		var a = 1; //全局變量
		! function b() {
			var a = 2; //局部變量a在這行定義
			console.log(window.a); //a爲1,這裏的a是全局變量哦!
			console.log(a); //a爲2,這裏的a是局部變量哦!
		}()
		console.log(a); //a爲1,這裏並不在function b scope內,a的值爲全局變量的值
</script>

3.2 零散變量的問題

Javascript在執行前會對整個腳本文件的聲明部分做完整分析(包括局部變量),從而確定變量的作用域。所以Javascript允許在函數的任意地方聲明變量,無論在哪裏聲明,效果都等同於在函數頂部進行聲明。怎麼理解呢?看下面一個例子:

<script>
		var str = "我是全局變量";
		! function b() {
			console.log(str); //結果:undefined
			var str = "我是局部變量";
			console.log(str); //結果:我是局部變量
		}()
</script>

爲什麼不是: 我是全局變量 和 我是局部變量?
原因很簡單:對JavaScript而言,只要變量是在同一個範圍(函數)裏,就視爲已經聲明,哪怕是在變量聲明前就使用。上面的代碼相當於:

<script>
		var str = "我是全局變量";
		! function b() {
			var str; //系統自動賦值爲 str = undefined
			console.log(str); //結果:undefined
			var str = "我是局部變量";
			console.log(str); //結果:我是局部變量
		}()
</script>

3.3. 變量釋放問題

請看下面的代碼:

<script>
		var a = "hello"; //全局變量
		window.b = "word"; //全局變量
		delete a;
		delete b;
		console.log(typeof a); //結果:string
		console.log(typeof b); //結果:undefined
		! function b() {
			var c = 1; //局部變量
			d = 2; //全局變量
			delete c;
			delete d;
			console.log(typeof c); //結果:number
			console.log(typeof d); //結果:undefined
		}()
</script>

結論:

  • 使用 var 創建的變量不能使用 delete 釋放內存。
  • 不使用 var 創建的變量可以使用 delete 釋放內存。

總結:

1.在過程體內(包括方法function(){},對象Object o={})內的對象)加var保留字則爲局部變量,其他情況下都是全局變量(無論是否使用var。不進行聲明而直接使用全局變量會報錯(可以隱式聲明),而局部變量先使用後聲明則不會報錯,只是值爲undefined。

2.全局變量跟局部變量重名時,局部變量的範圍會覆蓋掉全局變量的範圍,當離開局部變量的範圍後,又重回到全局變量的範圍。(若想指定是全局變量可以使用 window.globalVariableName。

3.Javascript允許在函數的任意地方聲明變量,無論在哪裏聲明,效果都等同於在函數頂部進行聲明

4.使用 var 創建的變量不能使用 delete 釋放內存,其他方式創建的變量可以使用 delete 釋放內存。

 

一般來說全局變量所帶來的 bug 問題非常多,所以最好儘量少用全局變量。另外,聲明變量最好帶 var, 不應使用帶 var 的鏈式賦值,在函數體內定義變量時,最好把變量聲明放在頂部,防止出現變量沒有被定義就被使用的邏輯錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章