分享我在學習web前端路上踩過的一些坑

在前端開發這條路上,相信不少人在前進的過程當中都有迷茫或者坎坷的時期,那麼是什麼支持咱們走的那麼遠呢,相信大多數人的回答都是對前端的熱愛。css

前端開發真的是一個漫長、艱苦而又收穫滿滿的。當咱們回首,之前所踩過的坑,都會使咱們變得更強大。html

 
 
 

不少人在初入前端時,都會或多或少得遇到一些小問題,有的會被html、css中佈局搞得頭大,有的會被js的邏輯關係纏得暈頭轉向,那麼咱們今天就來簡單地談談js中閉包吧。前端

不少人對於閉包的認識就是函數裏面嵌套一個函數,咱們不妨把閉包理解爲是將函數內部和函數外部鏈接起來的一座橋樑,他就是定義在函數內部的一個函數。閉包

衆所周知,js中聲明的變量是有做用域的,分爲全局變量和局部變量。在函數以外定義的是全局變量,函數內部能夠直接讀取全局變量。在函數以內定義的是局部變量,函數不能讀取其餘函數的局部變量。函數

 
 
 

那麼在上述代碼中,由於咱們的變量a是在函數fn內部定義的,因此他是一個局部變量,那麼根據函數不能讀取其餘函數的局部變量的定義,因此咱們函數fn2執行的結果是a is not defined。佈局

那麼咱們怎樣能夠讀取到函數fn內部的變量呢,這裏,咱們就可使用閉包。閉包有兩個最大的特色:一個是前面提到的能夠讀取函數內部的變量,另外一個就是讓這些變量的值始終保持在內存中。性能

因此咱們在函數fn內部定義了一個函數fn1,此時就造成了一個閉包。在咱們執行函數fn時,函數fn1能夠獲取到函數fn的內部變量,因此咱們的執行結果是1。htm

 

不過,閉包當然好用,可是由於閉包會使得咱們函數中聲明的變量都保存在內存中,不被js中的垃圾機制回收(在Javascript中,若是一個對象再也不被引用,那麼這個對象就會被GC回收。若是兩個對象互相引用,而再也不被第3者所引用,那麼這兩個互相引用的對象也會被回收。由於函數a被b引用,b又被a外的c引用,這就是爲何函數a執行後不會被回收的緣由。),因此內存消耗會很是大,致使咱們網頁性能差,不過這個問題咱們能夠找到一些解決辦法,使用閉包時,咱們在退出函數以前,將不使用的局部變量所有刪除;並且閉包還會在父函數外部改變父函數內部變量的值。因此咱們在使用時要當心,儘可能減小閉包的使用。對象

前端開發這條路漫長、艱辛而又收穫滿滿,但願各位且行且珍惜。blog

相關文章
相關標籤/搜索