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

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

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

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

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

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

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

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

所以我們在函數fn內部定義了一個函數fn1,此時就形成了一個閉包。在我們執行函數fn時,函數fn1可以獲取到函數fn的內部變量,所以我們的執行結果是1。

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

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章