仍記得剛來到公司的時候,老大跟咱們提及原型鏈、閉包、MV*之類的東西,當時真的是一臉懵逼的樣子啊哈哈javascript
在公司作前端開發也差很少四個月了,每一天感受都是很忙碌,都是忙着寫業務代碼或者本身在學習新東西,總感受不少知識點在這樣的狀態下,匆匆忙忙就略過了,本身並無真正理解掌握下來,仍是要趁有時間仍是把那些東西撿回來前端
先看一段JS代碼:java
function a(){ var num = 0; function b(){ num++; console.log(num); } return b; } var add = a(); add(); // 1 add(); // 2 add(); // 3
這段代碼的特色:閉包
·函數a裏面定義了一個函數b,函數b裏面的操做讓變量num自加的,最後一句是return b,將函數b返回了;函數
·add變量是指向了函數a的(有點像C的指針),函數a裏面的函數b是被外部變量add引用了,函數b就造成了一個閉包了。學習
那閉包通常用來幹嗎呢?spa
·在JavaScript模擬實現塊級做用域,封裝私有變量,防止污染全局變量指針
舉個栗子🌰對象
var foo = (function(){ var secret = "secret"; return { //特權方法 get_secret : function () { return secret; }, set_secret :function(new_secret){ secret = new_secret; } } })();
alert(secret) //undefined alert(foo.get_secret()); //secret foo.set_secret("x"); alert(foo.get_secret()); //x
JS是沒有相似Java的class、private關鍵字來封裝一個私有變量的,在JS是使用閉包機制去模擬實現的,首先在匿名函數裏聲明一個secret變量值也爲'secret',在函數的外部呢是沒法訪問到的。在匿名函數裏return的是setter和getter方法,foo對象指向的是匿名函數,這樣就能在外部去訪問一個局部變量了,可是要經過setter和getter的方法,它們也叫作特權方法blog
再或者呢,不設置setter的方法,只有個getter的方法,老大跟我說這樣就用在遊戲裏能防做弊了0.0
閉包的弊端:
javascript是高級語言,擁有自動的垃圾回收機制,所需內存的分配以及無用內存的回收徹底實現了自動管理。簡單來講就是找出那些再也不繼續使用的變量,而後釋放其佔用的內存。
垃圾收集方式主要有:一、標記清除;二、引用計數;
常見的方式就是標記清除了,垃圾收集器會給全部貯存在內存的變量加上標記,而後它會去掉環境中的變量以及被環境中被其餘變量引用的變量的標記,剩下還有標記的變量就被視爲準備刪除垃圾了,由於它們不會再被環境所使用到,最後,垃圾收集器完成內存清除工做。
到 2008 年爲止,IE、Firefox、Opera、Chrome 和 Safari 的 JavaScript 實現使用的都是標記清除式的 垃圾收集策略(或相似的策略),只不過垃圾收集的時間間隔互有不一樣。
正如上面說到的,閉包是在一個函數裏面函數,可是被外部的變量所引用到了,因此它是會永遠貯存在內存裏而不會被銷燬,形成了內存泄露,因此對於閉包仍是要謹慎使用
以上,是對於閉包機制的一些我的理解,若是文中出現錯誤,歡迎你們指正:)