1.在介紹閉包以前你們先看下面的代碼瀏覽器
再看閉包
圖片截的有點醜,很差意思哈函數
上面代碼的輸出結果是 // 11 12 13...... this
再來看另一種狀況設計
你們確定注意到代碼其實沒有變化只是,咱們在函數裏面定義變量 a 而已3d
結果卻大爲不一樣,由於在函數外定義變量它就是全局變量了,在函數執行完cdn
畢以後,其變量不會被js的垃圾回收機制回收,只有當你手動關閉瀏覽器之對象
後,它的內存纔會被銷燬(變量回收等價於銷燬內存),那麼有方法讓局部blog
變量內存不被銷燬嗎?那就得扯下閉包了圖片
閉包是指有權訪問另外一個函數做用域的變量的函數。建立閉包的常見方式,就是在一個函數內部建立另外一個函數。——Nicholas C.Zakas (摘自JavaScript高級程序設計)
1.舉個栗子
上面就是一個典型的閉包咯,包含 outer()和一個匿名函數,匿名函數使用了外部函數做用域的變量localval,outer()()就是調用裏面的匿名函數
2.關於閉包的this指向問題
因爲匿名函數的執行環境具備全局性,所以this此時指向window,爲何結果不是world呢函數在被調用時會自動取得變量this,內部函數經過做用域鏈搜索這個變量時,只能搜索到其活動對象爲止,所以獲取不到外部做用域的this變量,不過咱們能夠用另外的方法將其獲取
將this以活動對象的形式保存起來(所謂活動對象就是顯示的變量,this變量是隱式的),這樣咱們就能夠獲得obj的name值了,是否是很nice
3:閉包引發的內存泄漏
1.什麼是內存泄漏
咱們都知道,計算機分配給瀏覽器的內存是有限的,而若是變量一直不能被回收,計算機內存會撐爆,這就是內存泄漏,而閉包就會引發這樣的問題,由於建立閉包以後,其做用域鏈中的變量會一直存在着,沒法銷燬,所佔用的內存會愈來愈大。
2.解決內存泄漏
閉包函數中引用外部函數做用域裏的變量oBtn,咱們只有將其置爲null,這樣才能夠確保其內存被銷燬,這其實就跟最最前面寫的同樣,跟全局變量同樣內存不會被銷燬,咱們在使用閉包的同時必定要正確釋放其內存,不然後果嚴重
結束了,但願我寫的這些可以對你們瞭解閉包有所用!