1. 程式人生 > >我理解的閉包

我理解的閉包

情況 都是 理解 就會 通過 們的 網頁 scrip 問題

以下只是個人的一些見解

問題:什麽是閉包,為什麽會有閉包,閉包有什麽作用。

1、什麽是閉包:閉包,就是在函數1裏面聲明一個函數2,並在函數1中返回一個函數2,,使在函數1外面可以通過函數2來使用函數1的局部變量。

2、為什麽會有閉包:認識閉包之前,我們必須了解變量(全局變量和局部變量)。在一個函數裏定義一個局部變量,在函數外部是無法使用的,但是有時候特殊的需求使我們需要使用這個局部變量,那我們怎麽辦,閉包應運而生。有點類似於Java中的封裝,給你一個公共的接口來使用我類內部的屬性和方法(get()和 set())。

3、閉包的作用:第二個問題其實只是說了閉包的其中一個作用。閉包還有另外的作用,就是讓函數1裏的變量一直存在於內存中,為什麽呢,因為垃圾回收機制(garbage collection)會自動的回收、銷毀我們已經使用過的變量啊函數啊什麽的。而我們的閉包,就可以一定程度的避免這種情況。如果我們調用了函數1,那函數1裏的局部變量就會被垃圾回收機制給回收掉,內存中找不到了,但是呢,因為函數2依賴於函數1,所以函數1的變量就不會被回收。引用別人的一句話就是:當內部函數 在定義它的作用域 的外部 被引用時,就創建了該內部函數的閉包 ,如果內部函數引用了位於外部函數的變量,當外部函數調用完畢後,這些變量在內存不會被 釋放,因為閉包需要它們。想走,但是被別人拉著走不掉那種感覺。

註意事項:

1> 為什麽會有垃圾回收機制呢,為了釋放資源,節約內存。但是閉包的話,該釋放掉的內存無法釋放,資源一直被占用,所以閉包是十分的消耗內存 的,所以不能濫用閉包,否則會造成網頁的性能問題,在IE中可能導致內存泄露。解決方法是,在退出函數之前,將不使用的局部變量全部刪除。

2> 還有一點就是,函數1裏定義局部變量,為什麽定義局部變量呢,因為不想外部也可以隨便的對他進行操作嘛,但是如果使用了閉包,你就可以在函數外部對其內的局部變量進行修改,所以,不要隨便修改函數1內部的變量值

另外:JavaScript中所有的function都是一個閉包

我理解的閉包