js:變量,做用域以及內存問題

最近在重讀《javascript高級程序設計》這本書,「溫故而知新」,古人誠不欺我,再看的時候發現不少知識是以前不理解便跳過的,也有不少以前只是知道並記住了,並不能造成一套體系,而不斷的回顧,不斷地總結,我發現有不少零零散散的知識點在不經意間就被串在了一塊兒,恍然大悟的感受甚是美妙javascript

而我一貫喜歡思惟導圖和記憶的方式去學習總結,在用文字表達和總結方面顯得很貧乏,因此打算用這種博客的形式來記錄下重讀過程當中的總結,就當是記個筆記,也順便練練表達能力java

 

變量:es6

js中的變量可能包含兩種不一樣數據類型的值:分爲基本類型值和引用類型值。二者區分的本質是取決於變量在內存中的存儲方式,基本類型值存放在棧內存中,引用類型值保存在堆內存中。瀏覽器

而因爲兩種類型的保存方式不一樣,咱們在複製變量值的時候就會發現:對基本類型值的複製是值複製,複製後的變量值與變量值只是數據相同並且,在內存中是獨立的;對引用類型值的複製是其實也是「值」複製,不過這個值是一個指針,而咱們真正會操做的數據是指針指向的一個內存,咱們複製的那個指針「值」只是一個指向真正數據內存的地址,也就是咱們常說的引用,因此,在引用類型的複製中,最終複製後的變量與複製前的變量指向同一數據,因此對其中任何一個變量進行改變都會影響另一個函數

目前簡單數據類型有:Undefined,Null,String,Number,Boolean,Symbol(es6新增數據類型)學習

複雜數據類型:Objectspa

而對簡單數據類型,一般用typeof來判斷,其返回值有:「undefined」,「string」,「number」,「boolean」,「symbol」,「function」,「object」而typeof null == 「object」,是由於歷史遺留問題,而自己null也表示「該變量爲一個空的指針」,因此,其typeof的結果爲「object」也能夠理解了設計

而對複雜數據類型,一般使用instanceof來判斷,表示是不是該對象的實例對象,經過原型鏈(暫不作討論)來判斷指針

而對一些特殊的數據類型,咱們也有對應的方法判斷其類型:數據的Array.isArray,非數字的isNaN對象

 

執行環境與做用域:

首先,明確幾個知識點:1)每一個函數都有本身的執行環境  2)執行環境定義了變量或函數有權訪問的其餘數據  3)每一個執行環境都有一個與之關聯的變量對象,執行環境中定義的全部變量和函數都保存在這個對象中

對以上三點我所理解的就是:每一個函數在內存中都有一個與之關聯的對象,該對象中保存了這個函數內部定義的變量,方法等一切信息,是對這個函數的一個描述對象

而當函數執行時,函數的執行環境會被推入到一個環境棧中,此時會造成與其餘執行環境的一種「包含」或者「平行」的關係,而這種「包含」的體現就是「做用域鏈」,更嚴謹的說法是:當代碼再一個環境中執行時,會建立變量對象的一個做用域鏈。而做用域鏈的做用就很牛逼了,咱們常常說的變量查找從局部做用域到外層再到外層直至全局做用域就是依靠這條做用域鏈。做用域鏈只能向上查找。

 

內存問題

js的垃圾回收機制使得執行環境會管理代碼執行過程當中使用的內存,而按照咱們對執行環境和做用域的理解,咱們知道,代碼執行結束後,執行環境被從環境棧中推出,此時執行環境中的局部變量也就沒有存在的意義了,因此,此時須要告知該執行環境中的局部變量應該被回收,而具體的回收策略在瀏覽器中有:

1:標記清除:變量的標記從「進入執行環境」到「離開執行環境」,回收機制只要清除那些標有「離開」的變量便可

2:引用計數:當聲明瞭一個變量並將一個引用類型值賦給該變量時,則這個值的引用次數加1,若是同一個值又被賦給另一個變量,則減1,回收機制負責回收引用次數爲0的值。可是這種方法遇到循環引用時,便會陷入僵局,因此,該方法使用場景較少

 

 

越寫越亂的感受,表達能力仍是太欠缺了,還須要多練習,對知識也要深刻理解,加油!!!

相關文章
相關標籤/搜索