三分鐘帶你了解什麼是閉包
閉包作為javascript中一個難點會經常出現在前端學習者的視野中,樓主當初也看了很多關於講解閉包的文章,很多都是看完了更懵了,其實閉包理解了就很簡單,今天就簡單來介紹一下閉包,相信看完後大家都會清楚地知道什麼是閉包。
概念:
在理解閉包之前,我們要首先理解javascript 特殊的變數作用域。
變數的作用域分位兩種,全局變數和局部變數。而javascript有別於其他語言的地方在於,函數內部可以讀取全局變數。但是在函數外部無法讀取函數內部的局部變數。
然而有些時候,出於某些原因我們會需要獲取函數內部的局部變數,由於前面提到的作用域的限制,外部無法獲取內部的作用域,而內部可以獲取外部的作用域。因此我們可以通過在函數內部定義一個新的函數的方法來達到目的。
function f1(){
var hi = "hello, world!";
function f2(){
alert(hi); // hello, world!
}
}
在上面的代碼中,函數f2被包括在函數f1內部,這時f1內部所有的局部變數對f2都是可見的。因此,只要把f2作為返回值,就可以在外部獲取到f1內部的變數了。
上面代碼中的f2函數,就是閉包。
總結:
閉包是能夠讀取其他函數內部變數的函數。由於在javascript語言中,只有函數內部的子函數才能讀取局部變數,因此可以把閉包簡單理解成「定義在一個函數內部的函數」。
作用:
閉包的作用主要體現在兩點:
1、讀取函數內部的變數;
2、讓這些變數的值始終保持在內存中,不會在f1被調用後自動清除。
注意點:
1、由於閉包會使得函數中的變數都被保存在內存中,內存消耗過大,所以不能濫用閉包。否則會造成網頁的性能問題,在IE中可能會導致內存泄漏。解決辦法是,在退出函數之前,將不使用的局部變數全部刪除。
2、閉包會在父函數外部,改變父函數內部變數的值。所以,如果你把父函數當作對象(object)使用,把閉包當作它的公用方法(public method),把內部變數當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函數內部變數的值。
文|孫志遠
編輯|蘇丹
圖片|來自網路
點擊展開全文
TAG:E紀 |