JS基礎複習(四)四分鐘帶你徹底搞定全局變量和局部變量

JS基礎複習(四)四分鐘帶你徹底搞定全局變量和局部變量

一、寫在開頭
這個是因爲最近期末考要考web,恰好有這個知識點,所以我自己總結了一下,希望可以幫助到大家。

二、發現問題
區分什麼是局部變量,什麼是全局變量,變量之間賦值後結果是什麼,由於考慮到基礎問題,我不會深入講閉包作用域什麼的,大家可以看看我下面的示例,自己思考。

三、解決問題
1.首先我們看看如何在函數內修改全局變量,很簡單,只需要外面有定義一個全局變量,在函數內可以直接使用該變量(全局通用),該全局變量被修改的話在哪個地方使用都會是修改後的值,無關return。

// 在函數內修改全局變量,不需要return就能修改全局變量的值
var a1 = 10;
function test1 () {
	a1 = 20;
	console.log(a1); // 20
}
test1();
console.log(a1); // 20

// 同樣是在函數內修改全局變量,這裏return返回了修改後的全局變量,結果無異
var a2 = 10;
function test2 () {
	a2 = 20;
	console.log(a2); // 20
	return a2;
}
test2();
console.log(a2); // 20

2.如果全局變量和局部變量重合呢?很簡單在函數體內的話,局部變量會覆蓋全局變量,而在函數外由於訪問不到局部變量所以會訪問到全局變量的值,因此不管函數內怎麼修改,改變的始終是局部變量的值,不會影響全局變量。當然如果我們想訪問到這個被修改的局部變量,可以通過return 局部變量,在外面拿到這個局部變量(閉包)。

// 全局變量和局部變量取同一個名字,則在函數體內局部變量覆蓋全局變量,函數體外仍是全局變量
var a3 = 10;
function test3 () {
	var a3 = 20;
	console.log(a3); // 20
}
test3();
console.log(a3); // 10

// 依然是全局變量和局部變量取同一個名字,區別在於我們返回了局部變量,可以在外面使用這個局部變量(閉包)
var a4 = 10;
function test4 () {
	var a4 = 20;
	console.log(a4); // 20
	return a4;
}
test4();
var result = test4(); // 20
console.log(result);
console.log(a4); // 10

3.然後說隱式聲明全局變量,如果在聲明不加var的話就會被看成是全局屬性(姑且可以看成全局變量,只不過全局屬性是可以被刪除,全局變量不可以),既然是全局變量,不管是在函數內函數外都可以被訪問到!當然了,如果隱式聲明全局變量是寫在函數內的,那麼這個函數必須執行,否則會undefined!

	// 這裏我們隱式聲明全局變量(其實正確的說是全局屬性),在函數內調用全局變量改變了全局變量的值
	function test5 () {
		a5 = 10;
		a5 = a5 + 10;
		console.log(a5); // 20
	}
	test5();
	console.log(a5); // 20

	// 這裏不僅僅是隱式聲明全局變量,還接收了一個參數在函數內調用全局變量改變全局變量的值
	function test6 (result) {
		a6 = 10;
		a6 = a6 + result;
		console.log(a6); // 20
	}
	test6(10);
	console.log(a6); // 20

4.這裏看一個稍微有點奇怪的例子,這裏由於多了var t = 3,在預解析的時候會出現變量提升,導致t變成了局部變量,同時變量提升並不會賦值所以是undefined,undefined加上10自然是NAN。

/*這裏看似與test1差不多,但是由於有var t = 3; 導致變量提升,t不再是全局變量而是局部變量,而變量提升卻不會賦值
所以t是undefined,再加上參數10則是NAN非數字了,提升後可以看成test7
*/
var t = 10; 
function test(test){ 
    t = t + test; 
    console.log(t); // NAN
    var t = 3; 
} 
test(t); 
console.log(t); // 10

var t = 10; 
function test7(test){ 
	var t = undefined;
    t = t + test; // undefined+10
    console.log(t); // NAN
     t = 3; // 無效
} 
test(t); 
console.log(t); // 10

總結:
上面的例子比較好的說明了一些基本的情況,我這裏再總結一下:
1.函數外聲明的可認爲是全局變量,函數內聲明的是局部變量,一般無法被外界訪問,除非閉包等。
2.變量聲明時不加var是認爲全局變量(實際上是全局屬性),全局都可以訪問。
3.全局變量與局部變量同名的話,兩者的值不會互相影響。

好了,目前先到這,我是O5,希望能幫助到大家,共勉!

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