好程式設計師技術分享淺談JavaScript中的閉包
好程式設計師 技術分享 淺談 JavaScript 中的閉包 , js 閉包 是指有權訪問另一個函式作用域中的變數的函式 , 個人認為 js 閉包最大的用處就是防止對全域性作用域的汙染。 試想如果我們把一些僅僅只用到一兩次的變數都宣告在全域性作用域中,最後肯定是容易出錯且不可維護的。而閉包最神奇的地方就是能在一個函式外訪問函式中的區域性變數,把這些變數用閉包的形式放在函式中便能避免汙染。
一、閉包是什麼?
《 JavaScript 高階程式設計》中寫道: “閉包是指有權訪問另一個函式作用域中的變數的函式”,如果用下定義的觀點看,這句話就是說“閉包是函式”,我帶著懷疑的心態又去網上找了找,發現什麼說法都有,終究沒能明白閉包的含義,還是看程式碼來得直接。
function outter() {
var sky= "blue" ;
function inner() {
console .log(sky);
}
return inner;
} var result=outter();
result(); //"blue"
這段程式碼就包含一個簡單的閉包: outter函式的返回值是一個函式,即inner。inner在outter內部,理所當然能訪問到區域性變數sky,但當inner作為outter的返回值賦給outter外的全域性變數時,神奇的事情發生了:在全域性作用域中訪問到了sky,這就是閉包。
二、閉包的原理 ?
每個函式都有自己的執行環境,當一個函式被執行時,它的執行環境就會被推入環境棧,其活動物件 (儲存環境中定義的變數及函式)加入作用域鏈中,一旦函式執行完,棧將其環境彈出,活動物件被銷燬。
對於上面的例子來說, outter執行完之後將返回inner給了result,outter的執行環境從環境棧彈出,控制權交給全域性環境,outter的活動物件理應被銷燬。但此時inner已經儲存在全域性活動物件中了,同時inner需要訪問sky,所以outter的活動物件沒有被銷燬,即使result執行完畢,outter的活動物件依然存在於作用域鏈中,只有當result被銷燬
//code from = null ;
outter的活動物件才會徹底釋放。
三、閉包有什麼用 ?
說了這麼多,閉包到底有什麼用呢?我個人認為閉包最大的用處就是防止對全域性作用域的汙染。 試想如果我們把一些僅僅只用到一兩次的變數都宣告在全域性作用域中,最後肯定是容易出錯且不可維護的。而閉包最神奇的地方就是能在一個函式外訪問函式中的區域性變數,把這些變數用閉包的形式放在函式中便能避免汙染。
四、 Caveat
· 閉包將函式的活動物件維持在記憶體中,過度使用閉包會導致記憶體佔用過多;
· 閉包只能取得外部函式中任何變數的最後一個值,在使用迴圈且返回的函式中帶有迴圈變數時會得到錯誤結果;
· 當返回的函式為匿名函式時,注意匿名函式中的 this指的是window物件。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2640388/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好程式設計師HTML5培訓技術分享JavaScript 閉包程式設計師HTMLJavaScript
- 好程式設計師技術分析JavaScript閉包特性詳解程式設計師JavaScript
- 好程式設計師技術文件HTML5開發中的javascript閉包程式設計師HTMLJavaScript
- 好程式設計師技術教程分享JavaScript運動框架程式設計師JavaScript框架
- 好程式設計師web前端教程分享js閉包程式設計師Web前端JS
- 好程式設計師技術分享html5和JavaScript的區別程式設計師HTMLJavaScript
- 好程式設計師web前端教程分享前端javascript練習題之閉包案例程式設計師Web前端JavaScript
- 閉包 | 淺談JavaScript閉包問題JavaScript
- 好程式設計師大資料教程分享Scala系列之閉包程式設計師大資料
- 好程式設計師web前端培訓分享JavaScript學習筆記閉包與繼承程式設計師Web前端JavaScript筆記繼承
- 好程式設計師前端學習路線分享模擬JavaScript中物件導向技術程式設計師前端JavaScript物件
- 好程式設計師分享JavaScript建立物件的方式!程式設計師JavaScript物件
- 好程式設計師Java教程分享面試中Spring的技術問題程式設計師Java面試Spring
- 好程式設計師分享JavaScript中8個常見的陷阱程式設計師JavaScript
- 好程式設計師web前端技術分享css盒模型程式設計師Web前端CSS模型
- 技術分享| 淺談排程平臺設計
- 好程式設計師JavaScript教程分享JavaScript中變數和作用域程式設計師JavaScript變數
- 好程式設計師分享javascript中的常見的相容寫法程式設計師JavaScript
- 好程式設計師Java培訓分享Java之反射技術程式設計師Java反射
- 好程式設計師web前端技術分享媒體查詢程式設計師Web前端
- 好程式設計師前端教程之JavaScript閉包和匿名函式的關係詳解程式設計師前端JavaScript函式
- 好程式設計師分享JavaScript之-文件物件模型(DOM)程式設計師JavaScript物件模型
- 好程式設計師雲端計算教程分享Mysql技術知識點程式設計師MySql
- 好程式設計師分享javascript中陣列化的一般見解程式設計師JavaScript陣列
- 好程式設計師web前端分享JavaScript中常見的反模式程式設計師Web前端JavaScript模式
- 好程式設計師分享JavaScript幾個最常見的錯誤程式設計師JavaScript
- 好程式設計師Java培訓Java程式設計師必學技術程式設計師Java
- 好程式設計師Java教程分享Java技術知識點總結程式設計師Java
- 好程式設計師大資料培訓分享Spark技術總結程式設計師大資料Spark
- 淺談js閉包JS
- 好程式設計師web前端培訓分享學習JavaScript程式設計師Web前端JavaScript
- 好程式設計師web前端教程分享javascript 練習題程式設計師Web前端JavaScript
- 好程式設計師web前端分享前端 javascript 練習題程式設計師Web前端JavaScript
- 好程式設計師web前端教程分享JavaScript面試題程式設計師Web前端JavaScript面試題
- 好程式設計師web前端教程分享JavaScript簡寫方法程式設計師Web前端JavaScript
- 好程式設計師web前端培訓分享JavaScript框架J程式設計師Web前端JavaScript框架
- 好程式設計師Web前端教程分享JavaScript開發技巧程式設計師Web前端JavaScript
- 好程式設計師Java學習路線分享JavaEE的13種核心技術程式設計師Java