javacript深入淺出 閉包

2021-09-11 14:47:06 字數 2023 閱讀 2282

簡單的對閉包做乙個理解:

在看閉包之前我們還需要理解作用域

作用域主要分為兩種:全域性變數和區域性變數。

複製**

全域性變數&區域性變數

區域性變數:只能用於定義它函式內部。對於其他的函式或指令碼**是不可用的。 這裡定義的n就是區域性變數。

function

mytest1

() console.log(n);//n is not defined

console.log( mytest1());//3

複製**

全域性變數:函式可以訪問由函式內部定義的變數。 這裡定義的m就是區域性變數。

var m = 3;//全域性變數

function

mytest2

() console.log(m);//3

console.log( mytest2());//3

複製**

從這裡我們就可以知道,函式內部可以呼叫全域性變數,但是函式外部無法讀取函式內的區域性變數

函式內部宣告變數的時候,必須使用var命令去宣告乙個變數。如果不用的話,就會宣告了乙個全域性變數。

function

mytest3

()console.log( mytest3());//4,3

console.log(k);//3

console.log(j);//j is not defined

複製**

在這裡我們jk都是在函式內部宣告的,但是因為j使用了var,而k沒有使用var宣告,所以在外部能夠使用k;也就是所謂的宣告了乙個全域性變數

function

mytest4()}

var func = mytest4();

console.log(func());//4

複製**

在這裡我們是不是有點明白了呢:如果我們想用乙個變數或者得到乙個變數,但是我們又不想全域性宣告定義這個變數,到這的時候我們就可以通過閉包來呼叫函式內部的變數。

function

mytest5()}

var func = mytest5();

func();//4

func();//5

console.log(func());//6

複製**

不知道這個例子大家理解了沒,也就是說呼叫一次,然後i的值就變了一次並且會一直被儲存,然後下次呼叫的時候就是上次儲存的值了。

**

由於閉包會使得函式中的變數都被儲存在記憶體中,記憶體消耗很大,所以不能濫用閉包,否則會造成網頁的效能問題,在ie瀏覽器中可能導致記憶體洩露。解決方法是,在退出函式之前,將不使用的區域性變數全部刪除

function

mytest6

() }

var func = mytest5();

console.log(func());//4

func = null;//n被**

var func = mytest5();

console.log(func());//4

複製**

總結

閉包的缺點就是常駐記憶體,閉包會使變數始終儲存在記憶體中,如果使用不當會增大記憶體使用量,很容易造成記憶體洩露。

正常情況下外部函式是不能訪問內部函式的變數的,但是可以利用閉包來實現對函式內部變數的訪問。

一般函式執行完畢後,區域性活動物件就被銷毀,記憶體中僅僅儲存全域性作用域。但閉包的情況不同!

深入淺出Javascript 物件導向之閉包

閉包是指 有權訪問另乙個函式作用域中的變數的 函式。函式式閉包 在內部儲存資料和對外部無 在乙個函式內部建立另乙個函式 閉包 普通函式 在outer 執行完,區域性變數local被銷毀,記憶體僅僅儲存全域性作用域。function outer outer 30閉包 在outer 執行後,func 仍...

深入淺出sizeof

int佔 位元組,short佔 位元組 1.0 回答下列問題 答案在文章末尾 1.sizeof char 2.sizeof a 3.sizeof a 4.strlen a 如果你答對了全部四道題,那麼你可以不用細看下面關於sizeof的論述。如果你答錯了部分題目,那麼就跟著我來一起 關於sizeof...

深入淺出ShellExecute

ipconfig c log.txt應如何處理?二樓的朋友,開啟拔號網路這樣 shellexecute null,open c windows rundll32.exe shell32.dll,control rundll c windows system telephon.cpl null,sw ...