簡單的對閉包做乙個理解:
在看閉包之前我們還需要理解作用域。
作用域主要分為兩種:全域性變數和區域性變數。
複製**
全域性變數&區域性變數
區域性變數:只能用於定義它函式內部。對於其他的函式或指令碼**是不可用的。 這裡定義的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
複製**
在這裡我們j
和k
都是在函式內部宣告的,但是因為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 ...