對js中局部變量、全局變量和閉包的理解
對js中局部變量、全局變量和閉包的理解
局部變量
對於局部變量,js給出的定義是這樣的:在 JavaScript函數內部聲明的變量(使用 var)是局部變量,所以只能在函數內部訪問它。(該變量的作用域是局部的)。可以在不同的函數中使用名稱相同的局部變量,因為只有聲明過該變量的函數才能識別出該變量。只要函數運行完畢,本地變量就會被刪除。
我們先來逐步理解:
-
只能在函數內部訪問
function test() { var a = 0; return a; } console.log(a); //結果:a is not defined
上面的代碼聲明了一個test()函數,在函數內部聲明了一個局部變量a,當我們嘗試在函數外訪問局部變量a時,出來的結果是
a is not defined
我們再來看下面這個例子:
function test() { var a = 0; return a; } console.log(test()); //結果:0
以上兩個例子很好的闡述了局部變量只能在函數內部訪問,當調用函數時,函數域自動執行其中的代碼,局部變量自然也被調用。
-
只要函數運行完畢,本地變量就會被刪除
function b() { var y = 0; z = ++y; console.log("這是局部變量y:",z) return z; } console.log(b(),b(),b()); //結果:這是局部變量y: 1 //這是局部變量y: 1 //這是局部變量y: 1 //1 1 1
從上面代碼我們可以看出,我們執行了3次函數調用,得到的結果都是1,可能有人會說,這很簡單啊,每次出來的結果都是1,那是因為每次執行函數,函數內都會將局部變量y初始化為0。沒錯,的確是這樣,但是如果不初始化變量,則得到的返回值是
NaN
,所以初始化是必要的。所以,無論用什麼辦法,在函數內部用一個局部變量去做累加,是不可能實現的。但是,我們可以通過全局變量和閉包來實現累加。
全局變量
在js中,這樣定義全局變量, 在函數外聲明的變量是全局變量,網頁上的所有腳本和函數都能訪問它。 全局變量會在頁面關閉后被刪除。
-
我們再來看一個例子
var a = 0; function b() { ++a; console.log("這是全局變量a",a); return a; } console.log("這是未改變的全局變量a:",a,"這是函數b():",b(),b(),b(),"這是改變后的全局變量a:",a); //結果:這是全局變量a 1 //這是全局變量a 2 //這是全局變量a 3 //這是未改變的全局變量a: 0 這是函數b(): 1 2 3 這是改變后的全局變量a: 3
上面代碼定義了一個全局變量a,和一個b()函數,通過函數內部對a執行自加加,實現了累加目的,通過三次調用函數,得到的結果a為3。
閉包
什麼是閉包呢?閉包的定義是這樣的,閉包是一種保護私有變量的機制,在函數執行時形成私有的作用域,保護裏面的私有變量不受外界干擾。直觀的說就是形成一個不銷毀的棧環境。
我對閉包的理解是這樣的,閉包就是一個內嵌函數引用頂層函數的變量,而頂層函數是一個立即執行函數(自調用函數),因為它會自動調用,所以局部變量不會被刪除,但是這會增加內存消耗。
-
來看一個例子
function a() { var b = 0; return function() { return ++b; } } var closure = a(); console.log("這是閉包:",closure(),closure(),closure()); //結果:這是閉包: 1 2 3
我們看到,由於閉包的特殊機制,使得局部變量在函數執行完之後不會被銷毀,由此得到的最後結果為3 ,而不是1。
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】
※高價收購3C產品,價格不怕你比較
※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!
※網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!
※想知道最厲害的台北網頁設計公司推薦、台中網頁設計公司推薦專業設計師”嚨底家”!!