JavaScript高級程序設計(第3版)第四章讀書筆記

第四章 變量、做用域和內存問題前端

  1. ECMAScript變量可能包含兩種不一樣數據類型的值:基本類型值和引用類型值。基本類型指的是簡單的數據段,而引用類型值指那些可能由多個值構成的對象。基本數據類型是:Undefined、Null、Boolean、Number和String。引用類型的值是保存在內存中的對象。JavaScript不容許直接訪問內存中的位置,即不能直接操做對象的內存空間。
  2. 不能給基本類型的值添加屬性,只能給引用類型值動態地添加屬性。
  3. 從一個變量向另外一個變量複製基本類型值時,兩個變量能夠參與任意操做而不會相互影響,但從一個變量向另外一個變量複製引用類型值時,兩個變量實際上將引用同一個對象,即改變某一個變量,可就會影響另外一個變量。
  4. ECMAScript中全部函數的參數都是按值傳遞的,即把函數外部的值複製給函數內部的參數,就和把值從一個變量複製到另外一個變量同樣。
  5. 在檢測引用類型的值時,typeof操做符用處不大,要肯定是什麼類型的對象,則使用instanceof操做符,語法以下:Result = variable instanceof constructor全部引用類型的值都是Object的實例,在檢測一個引用類型值和Object構造函數時,instanceof操做符始終會返回true,使用instanceof操做符檢測基本類型的值,則始終返回false,由於基本類型不是對象。
  6. 執行環境定義了變量或函數有權訪問的其餘數據,每一個執行環境都有與之關聯的變量對象,在Web瀏覽器中,全局執行環境被認爲是window對象。每一個函數都有本身的執行環境。當代碼在一個環境中執行時,會建立變量對象的一個做用域鏈(scope chain),做用域鏈的用途,是保證對執行環境有權訪問的全部變量和函數的有序訪問。做用域的前端,始終都是當前執行的代碼所在環境的變量對象。例如當環境是函數時,活動對象最開始只包含了一個變量,即arguments對象(這個對象在全局環境中是不存在的。)全局執行環境的變量對象始終都是做用域鏈中的最後一個對象。
  7. 內部環境能夠經過做用域鏈訪問全部的外部環境,但外部環境不能訪問內部環境中的任何變量和函數。
  8. 延長做用域鏈的兩種方法:try-catch語句的catch塊和with語句。
  9. JavaScript沒有塊級做用域,但在JavaScript中,if語句中的變量聲明會將變量添加到當前的執行環境,另外,由for語句建立的變量i即便在for循環執行結束後,也依舊會存在於循環外部的執行環境中。
  10. 使用var聲明的變量會自動被添加到最接近的環境中,在函數內部,最接近的環境就是函數的局部環境;在with語句中,最接近的環境是函數環境。若是初始化變量時沒有使用var聲明,該變量會自動被添加到全局環境。
  11. 在查找標識符的過程當中,若是局部環境中存在着同名標識符,就不會使用位於父環境中的標識符。
  12. JavaScript具備自動垃圾收集機制,原理是在按照固定的時間間隔找出那些再也不繼續使用的變量,而後釋放其佔用的內存。第一種垃圾收集方式是標記清楚(mark-and-sweep),當變量進入環境時,就將這個變量標記爲「進入環境」,當變量離開環境時,則將其標記爲「離開環境」。該種方式被多種瀏覽器支持。另外一種不太常見的垃圾收集策略是叫作引用計數。引用計數的含義是跟蹤記錄每一個值被引用的次數。當這個值的引用次數變成0時,則說明沒有辦法在訪問這個值了,於是就能夠將其佔用的內存空間回收回來。
  13. 分配給Web瀏覽器的可用內存數量一般要比分配給桌面應用程序的少,這樣作的目的主要是出於安全方面的考慮,是爲了防止運行JavaScript的網頁好進所有系統內存而致使系統崩潰。一旦數據再也不用,最好經過將其設置爲null來釋放其引用,此作法叫作解除引用,適用於大多數全局變量和全局對象的屬性。解除引用的真正做用是讓值脫離執行環境,以便垃圾收集器下次運行時將其收回。
相關文章
相關標籤/搜索