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個字元且變數命名中間不允許有空格.
//使用正確的命名長度:如迴圈中用一個字元,如i ;或j; 條件和迴圈變數用一個單詞,方法名1-2個單詞,類名2-3個單詞,全域性變數3-4個單詞.變數名要使用有意義的名稱,通過變數名能大概反映出其具體的用途.
2.3、變數命名首個字元不允許為數字.
// 如:8oTxt (這是錯誤的命名!需要注意) 但是能在字母追加數字如: oLi2 (這是正確的)
2.4、 變數不能使用計算機指令碼語言中預留的關鍵字,及其保留字.
//如javascript中預留的:true,false,while,case,break保留字等
2.5、 JavaScript中大小寫敏感so(大寫字母的變數與小寫字母的變數是兩個不同的變數)
//如oB與ob 是兩個不同的變數
自己常犯的命名錯誤及
3、變數的宣告方法
1、 匈牙利命名法.該命名法是在每個變數名的前面加上若干表示資料型別的字元.基本原則是:變數名=屬性
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時就規定的,這樣可以在一