1. 程式人生 > >JavaScript區域性變數、全域性變數、閉包

JavaScript區域性變數、全域性變數、閉包

1、關於變數,個人通俗的理解:變數JavaScript,是一種容器,用於儲存臨時資料.

<詳情請看 javaScript資料型別 變數命名規範>

程式碼如下:

         <script type="text/javascript">

                  var nZ=6;

                 varnQ=8;

                 varnE=nZ+nQ;

         </script>

通過程式碼段我們可以看到 我將6的值儲存到nZ變數中,將8賦值給nQ中,然後將nZ和nQ的值加起來賦值給nE   如果最後我們彈出nE的話 alert(nE); 將會得到14.

2、變數的命名規範(五項)

2.1、 變數命名可以是字母a-z/A-Z(大小寫字母開頭) 或_(下劃線) 與$(美元符號)起始.

//oLi2   _aBtn   $oBox   (通常都不使用_ $下劃線或者$美元符)

2.2、變數命名的字元長度不允許超過255個字元且變數命名中間不允許有空格.     

//使用正確的命名長度:如迴圈中用一個字元,如;j;  條件和迴圈變數用一個單詞方法1-2個單詞類名2-3個單詞,全域性變數3-4個單詞.變數名要使用有意義的名稱,通過變數名能大概反映出其具體的用途.

2.3、變數命名首個字元不允許為數字.                                                                                

 // 如:8oTxt  (這是錯誤的命名!需要注意)            但是能在字母追加數字如:  oLi2  (這是正確的)

2.4、 變數不能使用計算機指令碼語言中預留的關鍵字,及其保留字.                                          

 //如javascript中預留的:true,false,while,case,break保留字等

2.5、 JavaScript中大小寫敏感so(大寫字母的變數與小寫字母的變數是兩個不同的變數)

//如oBob 是兩個不同的變數

自己常犯的命名錯誤及

3、變數的宣告方法

1、 匈牙利命名法.該命名法是在每個變數名的前面加上若干表示資料型別的字元.基本原則是:變數名=屬性

+型別+物件描述.如n表示number,所有n開頭的變數命都表示number型別.o表示object,所有變數命以o開頭的都表示object物件型別變數.
2、駱駝命名法.正如它的名稱所表示的那樣,是指混合使用大小寫字母來構成變數和函式的名字.駝峰命名法跟帕斯卡命名法相似,只是首字母小寫,如userName。因為看上去像駝峰,因此而得名。
3、帕斯卡命名法 即pascal命名法.做法是首字母大寫,如UserName,常用在類的變數命名中.

<變數宣告和函式宣告要提前 先宣告再用!>
4 區域性變數  <在函式內定義的變數為區域性變數>

在方法內定義的變數稱為“區域性變數”或“臨時變數”,方法結束後區域性變數佔用的記憶體將被釋放。

當局部變數與全域性變數重名時,起作用的是區域性變數<就近原則!>。    


5 全域性變數  <在所有函式外定義的變數即為 全域性變數>-------在函式內直接使用未宣告的變數 則為 全域性變數.如 num=600;

全域性變數,又稱“外部變數”,它不是屬於哪個方法,作用域從定義的地址開始到原始檔結束。

程式碼如下:

		<script type="text/javascript">
			//全域性變數最好少用或不用,以免重名 出錯
			var a=5;            //宣告變數a  屬於全域性變數,聲明後所有的函式內都可以使用  定義在所有函式的外部
			function aa(){      //宣告函式aa()無參函式
				var a=66;   //區域性變數,只有在函式aa中才能使用,函式的使用 就近原則。 
				alert(a);   //彈出變數a的值  彈出的值是66
			}
			aa();               //呼叫函式
		</script>
6 關於閉包(closure):

6.1  javascript中閉包的特性                                                                                                                    

6.1.1函式巢狀函式

6.1.2子函式內部可以引用父函式的引數和變數

6.1.3引數和變數不會被垃圾回收機制回收

6.2 如何定義閉包及閉包的優缺點:                                                                                                          

6.2.1閉包是指子函式使用父函式的區域性變數,子函式通過訪問和使用父函式的區域性變數.

6.2.2閉包也有缺點,使用完後不釋放就會一直存在,且佔據記憶體增大記憶體使用量,使用不當就會造成記憶體洩露.

6.2.3閉包是js指令碼語言的一大特徵,閉包的主要作用是:使得物件擁有私有的方法和變數 且使得變數一直存在與記憶體中.同時還可以避

免關於全域性變數與區域性變數的錯誤.

6.2.4函式一般情況執行完畢後就會被垃圾回收機制回收,且佔用的記憶體中只儲存函式的作用域,但閉包與此截然不同!


子函式使用父函式的變數程式碼如下:

   	function num() {  
            var i = 1;  
            return function(){
           		alert(i++);
            };  
        }         
        var fun = num();  
        	fun();//第一次執行後 a++,得到1
        	fun();//第二次執行後 a++,得到2 
        	fun = null;//a被回收!! 
從上面我們可以看到閉包會使變數始終儲存在記憶體中<方便接下來使用>,如果不當的使用會增大記憶體消耗甚至造成記憶體洩露. 

6.3 垃圾回收編輯   簡稱GC(Garbage Collection):JAVA/.NET中的垃圾收集器.                                        

Java是由C++發展來的.它擯棄了C++中一些繁瑣容易出錯的東西。其中有一條就是這個GC.而C#又借鑑了JAVA.

在js中同樣適用

6.3.1關於js的垃圾回收                                                                                                                                   

1)、在js中,果一個物件不再被引用,那麼這個物件就會被GC回收; 

2)、如果兩個物件互相引用,而不再被第三者所引用,那麼這兩個互相引用的物件也會被GC給回收.

6.4 關於js閉包占用記憶體的釋放                                                                                                                    

程式碼如下>實現累加後並釋放佔用記憶體:

			//使用匿名函式實現區域性變數駐留記憶體中,從而實現累加
			<script type="text/javascript">
			    function oBox(){
			        var nNum = 100;
			        return function(){          //匿名函式
			            nNum++;
			            return nNum;            //將內部結果返回!
			        };
			 	} 
			 	var a = oBox();
				alert(a());   //即alert(oBox()());    
				alert(a());
				alert(a());
				alert(a);     //---最後彈出上面申明的匿名函式  return function(){nNum++; return nNum;};  
				a = null;     //讓變數a為空 解除引用,等待GC垃圾回收
			</script>

6.5關於使用後的記憶體洩露<解決辦法>                                                                                                                         

程式碼如下:
由於IE的js物件和DOM物件使用不同的垃圾收集方法,因此閉包在IE中會導致記憶體洩露問題,也就是無法銷燬駐留在記憶體中的元素

					function count(){
					    var oDiv = document.getElementById('oDiv');//oDiv用完之後一直駐留在記憶體中
					    oDiv.onclick = function () {
					        alert('oDiv.innerHTML');  //這裡用oDiv導致記憶體洩露
					    };
					}
					count();
					function count(){
					    var oDiv = document.getElementById('oDiv');
					    var test = oDiv.innerHTML;
					    oDiv.onclick = function () {
					        alert(test);
					    };
					    oDiv = null;    //最後應將oDiv為空使記憶體避免洩露
					}

使用閉包必須注意的地方: 

1)由於閉包會使得函式中的變數都被儲存在記憶體中,記憶體消耗很大,所以不能濫用閉包,否則會造成網頁的效能問題,在IE中可能導致記憶體洩露。解決方法

是,在退出函式之前,將不使用的區域性變數全部刪除。

2)閉包會在父函式外部,改變父函式內部變數的值。所以,如果你把父函式當作物件(object)使用,把閉包當作它的公用方法(Public Method),把內部

變數當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函式內部變數的值。

相關推薦

JavaScript區域性變數全域性變數

1、關於變數,個人通俗的理解:變數在JavaScript中,是一種容器,用於儲存臨時資料. <詳情請看 javaScript資料型別 變數命名規範> 程式碼如下:          <script type="text/javascript">   

js中 區域性變數全域性變數

一、區域性變數 什麼是區域性變數呢,我們先通過下面的程式碼瞭解一下 <!DOCTYPE html> <html> <head> <meta charset="UTF-8">

對js中區域性變數全域性變數的理解

對js中區域性變數、全域性變數和閉包的理解 區域性變數 對於區域性變數,js給出的定義是這樣的:在 JavaScript函式內部宣告的變數(使用 var)是區域性變數,所以只能在函式內部訪問它。(該變數的作用域是區域性的)。可以在不同的函式中使用名稱相同的區域性變數,因為只有宣告過該變數的函式才能識別出該變數

Java中成員變數區域性變數全域性變數靜態變數存在位置及初始化

根據定義變數位置的不同,可以將變數分為成員變數和區域性變數。 成員變數是 定義在一個類的變數:類中方法外 區域性變數是定義在一個方法內的變數:方法中 成員變數分為: 靜態屬性:隨類的存在而存在,是在類載入的初始化 非靜態屬性:隨例項的屬性存在而存在。 區域性變數: 區域性變數不能加s

區域性變數 全域性變數 堆疊 靜態和全域性

一個由C/C++編譯的程式佔用的記憶體分為以下幾個部分 (1)棧區(stack)— 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。 (2)堆區(heap) — 由程式設計師分配和釋放,若程式設計師不釋放,程式結束時可能由OS回收。 (3)全域性區(靜態區)(static

157_static作用再溫習(修飾函式區域性變數全域性變數

下面是中興通訊2012校招筆試題的一道問答題: 1. static全域性變數與普通的全域性變數有什麼區別 ?   全域性變數(外部變數)的說明之前再冠以static 就構成了靜態的全域性變數。   全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。 這兩者在

1.成員變數&全域性變數&區域性變數&靜態變數常量和方法

原文:https://blog.csdn.net/panpuqin/article/details/75091468  原文:https://blog.csdn.net/bobo_993/article/details/73655765  @interface 

C++區域性變數全域性變數的作用域及範圍&動態記憶體管理

本文主要介紹C++中的區域性變數、全域性變數、以及動態記憶體管理的變數。本文不涉及靜態變數static,所以描述的觀點不包括static變數。 區域性變數和全域性變數 區域性變數一般指函式內部的區域性變數,這部分的變數儲存在棧裡面,當函式呼叫結束,這些區域性變數就會

Python新手坑 | lambda全域性變數區域性變數作用域柯里化

從一個看似簡單的問題引入 首先我們來看這樣一個例子,假設你正試圖編寫一個函式,呼叫時可以返回0~4的平方,你選擇用for loop 和 lambda 來實現: squares = [] for x in range(5): squares.append

static的作用(修飾函式區域性變數全域性變數

如有侵權,請聯絡。 在C語言中,static的字面意思很容易把我們匯入歧途,其實它的作用有三條。 先來介紹它的第一條也是最重要的一條:隱藏 當我們同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性。為理解這句話,我舉例來說明。我們要同時編

[Python學習] 專題六.區域性變數全域性變數global匯入模組變數

        定義在函式內的變數有區域性作用域,在一個模組中最高級別的變數有全域性作用域。本文主要講述全域性變數、區域性變數和匯入模組變數的方法。         參考:《Python核心程式設計

python基礎之四種函式型別函式的巢狀呼叫函式的區域性變數全域性變數

函式根據有沒有引數,有沒有返回值,可以相互組合,一共有4種 * 無引數,無返回值 * 無引數,有返回值 * 有引數,無返回值 * 有引數,有返回值 <1>無引數,無返回值的函式此類函式,不能接收引數,也沒有返回值,一般情況下,列印提示燈類似的功能,使用這類的函式 def pr

簡述static關鍵字的作用?(備註:在什麼條件下使用static修飾區域性變數全域性變數函式)

static關鍵字至少有下列n個作用: (1)設定變數的儲存域,函式體內static變數的作用範圍為該函式體,不同於auto變數,該變數的記憶體只被分配一次,因此其值在下次呼叫時仍維持上次的值; (

python基礎:函式名稱空間作用域全域性變數區域性變數

一、名稱空間: Python的名稱空間的本質是一個字典,用來記錄變數名稱和值。字典的key是變數的名稱,字典的value對於的是變數的值。 例如 {‘name’:’zs’,’age’:10} 名稱空間一共分為三種:區域性名稱空間、全域性名稱空間、內建名稱空間 區域性名稱空間: 每個函式都有自

Java之成員變數全域性變數區域性變數的區別

儲存區域: 全域性變數(全域性靜態變數)是放在方法區中。 成員變數如果沒有例項化那麼變數是放在棧中;例項化了物件放在堆中,棧中放的是指向堆中物件的引用地址。 區域性變數放在棧中,new的物件放在堆中,8中基本資料型別變數放在棧中,變數所對應的值是放在棧幀中。 生命週期

區域性變數全域性變數

預備知識—程式的記憶體分配  一個由C/C++編譯的程式佔用的記憶體分為以下幾個部分  棧區(stack)— 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。 堆區(heap) — 一般由程式設計師分配釋放,若程式設計師不釋放,程

對C語言 static作用——修飾 變數全域性變數/區域性變數函式

*******************************概念*********************************************************************************************************

面試總結之C語言的靜態變數全域性變數區域性變數

1、全域性變數 全域性變數具有全域性的作用域,在一個原始檔裡定義全域性變數,則所有原始檔都可以訪問這個變數,直到程式結束全域性變數才被銷燬。 2、靜態全域性變數 靜態全域性變數與全域性變數的區別是限制

區域性變數全域性變數main函式形參實參getchar

//區域性變數,呼叫完成之後會被回收 //區域性變數為塊語句服務,塊語句執行結束,區域性變數就會被回收 //函式內部定義的變數,還有函式的引數都是區域性變數 //區域性變數和全域性變數重名的情況下,

區域性變數全域性變數堆疊靜態和全域性的區別

一般全域性變數存放在資料區,區域性變數存放在棧區,動態變數存放在堆區,函式程式碼放在程式碼區。 棧區是普通的棧資料結構,遵循LIFO後進先出的規則,區域性變數安排在那裡是ASM時就規定的,這樣可以在一