摘要:具體來說就是當執行流進入下列任何一個語句時,作用域鏈就會得到加長語句的塊和語句。這兩個語句都會在作用域鏈的前端添加一個變量對象。對來說,會將指定的對象添加到作用域鏈中。
1. 基本類型和引用類型的值
JavaScript變量可以用來保存兩種類型的值:基本類性值和引用類性值。基本類型值源自以下5種基本數據類型:Undefined、Null、Boolean、Number和String。基本類型值和引用類性值有以下特點:
基本類型值在內存空間中占據固定大小的空間,因此會被保存在棧內存中;
從一個變量向另一個變量復制基本類型的值,會創建這個值的一個副本;
引用類型的值是對象,保存在堆內存中; 包含引用類型值的變量實際上包含的并不是對象本身,而是一個指向該對象的指針;
從一個變量向另一個變量復制引用類型的值,復制的其實是指針,因此兩個變量最終都指向同一個對象
確定一個值是哪種基本類型可以使用typeof操作符,而確定一個值是哪種引用類型可以使用instanceof操作符。
6、 只能給引用類型值動態地添加屬性
7、如果從一個變量向另一個變量復制基本類型的值,會在變量的對象上創建一個新值,然后把該值復制到為新變量分配的位置上;
8、當從一個變量向另一變量復制引用類型的值時,同樣也會將存儲在變量對象中的值復制一份放到為新變量分配的空間中。不同的是,這個值的副本實際上是一個指針,兩個變量實際上將引用一個對象。因此,改變其中一個變量就會影響另一變量。
2. 執行環境及作用域所有變量(包括基本類型和引用類型)都存在于一個執行環境(也稱為作用域)當中,這個執行環境決定了變量的生命周期,以及哪一部分代碼可以訪問其中的變量。以下是關于執行環境的幾點總結:
執行環境有全局執行環境(也稱全局環境)和函數執行環境之分;
每次進入一個新執行環境,都會創建一個用于搜索變量和函數的作用域鏈;
函數的局部環境變量不僅有權訪問函數作用域中的變量,而且有權訪問其包含(父)環境,乃至全局環境;
延長作用域鏈:有些語句可以在作用鏈的前端臨時增加一個變量對象,該變量對象會在代碼執行后被移除。具體來說就是當執行流進入下列任何一個語句時,作用域鏈就會得到加長:try-catch語句的catch塊和with語句。這兩個語句都會在作用域鏈的前端添加一個變量對象。對with來說,會將指定的對象添加到作用域鏈中。對catch語句來說,會創建一個新的變量對象。
全局環境只能訪問在全局環境中定義的變量和函數,而不能直接訪問局部環境中的任何數據;(如果局部環境中存在著同名標識符,就不會使用位于父環境中的標識符)
變量的執行環境有助于確定應該何時釋放內存;
使用var聲明的變量會自動被添加到最接近的環境中。如過初始化變量時沒有使用var聲明,該變量會自動被添加到全局環境中。
3. 垃圾收集JavaScript是一門具有自動垃圾收集機制的編程語言,開發人員不必關心內存分配和回收問題。可以對JavaScript的垃圾收集歷程做如下總結:
離開作用域的值將被自動標記為可以回收,因此將在垃圾收集期間被刪除;
"標記清除"是目前主流的垃圾收集算法。這種算法的思想是給當前不使用的值加上標記,然后再回收其內存;
另一種垃圾收集算法是“引用計數”,這種算法的思想是跟蹤記錄所有值被引用的次數。JavaScript引擎目前都不再使用這種算法;但在IE中訪問非原生JavaScript對象(如DOM元素)時,這種算法仍然可能會導致問題;
當代碼中存在循環引用現象時,“引用計數”算法就會導致問題;
循環引用指的是的對象A中包含一個指向對象B的指針,而對象B中也包含一個指向對象A的引用;
(1)解決辦法:在不使用它們的時候手工斷開原生JavaScript對象與DOM元素之間的連接
myObject.element = null;
element.someObject = null;
(2)將變量設置為null意味著切斷變量與它此前引用的值之間的連接。當垃圾收集器下次運行時,就會刪除這 些值并回收它們所占的內存
解除變量的引用不僅有助于消除循環引用現象,而且對垃圾收集也有好處。為了確保有效地回收內存,應該及時解除不再使用的全局對象,全局對象屬性以及循環引用變量的引用;
(1)優化內存占用的最佳方式,就是為執行中的代碼只保存必要的數據。一旦數據不再有用,最好通過將其設置為null來釋放其引用——這個做法叫做解除引用。
(2)解除引用的真正作用是讓值脫離執行環境,以便垃圾收集器下次運行時將其回收。
標記清除
- 給存儲在內存中的所有變量都加上標記,然后,它會去掉環境中的變量以及被環境中的變量引用的變量的標記。而在此之后再被加上標記的變量將被視為準備刪除的變量。最后,垃圾收集器完成內存清除工作,銷毀那些帶標記的值并回收它們所占用的內存空間。
引用計數
- 當聲明了一個變量并將一個引用類性值賦給該變量時,則這個值的引用次數就是1.如果同一個值又被賦值給另一個變量,則該值的引用次數加1。相反,如果包含對這個值引用的變量又取得了另一個值,則這個值的引用次數減1。當這個值的引用次數變成0時,則說明沒有辦法再訪問這個值了,因而就可以將其占用的內存空間回收回來。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/102385.html
摘要:遞歸閉包模仿塊級作用域私有變量小結在編程中,使用函數表達式可以無需對函數命名,從而實現動態編程。匿名函數也稱為拉姆達函數。函數聲明要求有名字,但函數表達式不需要。中的函數表達式和閉包都是極其有用的特性,利用它們可以實現很多功能。 1、遞歸 2、閉包 3、模仿塊級作用域 4、私有變量 5、小結 在JavaScript編程中,使用函數表達式可以無需對函數命名,從而實現動態編程。匿名函數也稱...
摘要:具體說就是執行流進入下列任何一個語句時,作用域鏈就會得到加長語句的塊。如果局部環境中存在著同名的標識符,就不會使用位于父環境中的標識符訪問局部變量要比訪問全局變量更快,因為不用向上搜索作用域鏈。 基本類型和引用類型的值 ECMAscript變量包含 基本類型值和引用類型值 基本類型值值的是基本數據類型:Undefined, Null, Boolean, Number, String ...
摘要:寫在前面本文記錄的是我不熟悉或者我認為值得注意的地方,并不是書上知識點的概括第章變量作用域和內存問題對象是按引用傳遞的我理解的是傳值其實傳的是一個指針,該指針指向內存中的某個對象。 寫在前面 本文記錄的是我不熟悉或者我認為值得注意的地方,并不是書上知識點的概括 第4章 變量、作用域和內存問題 對象是按引用傳遞的(我理解的是傳值其實傳的是一個指針,該指針指向內存中的某個對象)。舉例如下...
摘要:當代碼在一個環境中執行時,會創建變量對象的一個作用域鏈。作用域鏈的用途,是保證對執行環境有權訪問的所有變量和函數的有序訪問。這樣,一直延續到全局執行環境全局執行環境的變量對象始終都是作用域鏈中的最后一個對象。 變量、作用域和內存問題 基本類型和引用類型的值 基本類型值指的是簡單的數據段,而引用類型值值那些可能由多個值構成的對象。 定義基本類型值的引用和引用類型值的方法是類似的,創建...
閱讀 2857·2021-10-21 09:38
閱讀 2759·2021-10-11 10:59
閱讀 3040·2021-09-27 13:36
閱讀 1663·2021-08-23 09:43
閱讀 797·2019-08-29 14:14
閱讀 3037·2019-08-29 12:13
閱讀 3207·2019-08-29 12:13
閱讀 315·2019-08-26 12:24