摘要:中的變量是松散類型的即它在不同的時期可以有不同類型的值這也是最強大的的特性之一基本類型和引用類型的值的值類型有兩種基本類型引用類型。
ECMAscript中的變量是松散類型的,即它在不同的時期可以有不同類型的值,這也是ECMAscript最強大的的特性之一.
基本類型和引用類型的值javascript的值類型有兩種:基本類型 引用類型。基本類型的值是指的簡單的數據段,基本類型有五種,依次是:Undefined Boolean String Number Null,而引用類型的值指的是由多個值構成的對象.
基本類型值和引用類型值的區別 保存方式不同基本類型值的變量是保存確實的值.而引用類型值的變量保存的是一個指針,這個指針指向內存中的對象.
引用類型的值可以動態添加屬性和方法. 復制形式不同當基本類型值的變量被復制給另一個變量時,內存中會新開辟一個存儲空間來存儲這個新變量的值,新變量的值和被復制的變量的值保存在兩個不同的存儲空間中,它們相互獨立,互不影響.
當引用類型值的變量被復制給另一個變量時,內存中不會開辟新的空間,新變量保存的也是一個指向內存中對象的指針,新變量和舊變量指向的是同一個存儲區域,因此改變其中一個變量的值,另一個變量也會隨之改變.
var name = "yuhualingfeng"; var anotherName = name; alert(anotherName); // yuhualingfeng anoherName = "Jake"; alert(anotherName); // Jake alert(name); //yuhualingfeng
如上所示,改變了anotherName的值并沒影響到name變量的值.
var obj = new Object(); obj.name = "yuhualingfeng"; var anotherObj = obj; alert(anotherObj.name); // yuhualingfeng anotherObj.name = "Jake"; alert(anotherObj.name); // Jake alert(obj.name); Jake
改變anotherObj對象的name屬性值后,obj對象的name屬性值也隨之改變,這一點可以判斷出二者指向的是同一個存儲區域.
執行環境(作用域)執行環境是Javascript中最為重要的一個概念.執行環境定義了變量或函數有權訪問的其他數據,定義了它們各自的行為.每個執行環境都有一個與之關聯的變量對象
全局執行環境是最外層的執行環境,全局執行環境中有一個window全局對象,全局環境中的所有變量都可以通過window對象訪問.
除全局執行環境外,每個函數也都有一個自己的執行環境.當執行某個函數時,會產生一個由變量對象組成的作用域鏈,作用域鏈的存在是為了讓解析器能夠有序的找尋標識符,假如在函數中使用某個變量時,首先解析器會在函數自身的變量對象中找尋這個變量的標識符,假如沒找到,會繼續查找上一個變量對象,直到找到這個標識符為止.查找標識符時,
解析器會從作用域鏈中函數自身的變量對象開始尋找,直至全局執行環境中的變量對象,假如在全局環境中的變量對象中沒找到標識符,解析器就會拋出錯誤.
var age = 30; function changeAge(){ age = 40; } changeAge(); alert(age); // 40
changeAge的作用域鏈中有兩個變量對象,自身的變量對象和全局環境的變量對象,當執行changeAge函數時,調用了age變量,解析器先在changeAge變量對象中查找此變量,沒有找到,然后繼續查找上一個變量對象全局變量對象,找到了age變量.
有一點要注意的是,javascript中的作用域和其他編程語言不同,它沒有塊級作用域,看下面的例子:
function test(){ for(var i = 0,len =10;i < len;i++){ doSomething(i); console.log(i); // 10 } } test();
在for語句中定義的i變量,在for語句外可以被訪問到.javascript中定義的變量會把它添加到最近執行環境的變量對象中.這里會把i變量添加到test函數的變量對象中.
垃圾收集Javascript具有自動垃圾收集機制,執行環境會負責管理代碼執行過程中使用的內存.
垃圾回收機制的原理:垃圾收集器找出那些不再繼續使用的變量,然后釋放其占用的內存,垃圾收集器會按固定的事件周期性的執行內存回收.
用于標記無用變量策略因實現而異,具體到瀏覽器中的插件,通常有以下兩種策略:標記清楚 引用計數
標記清除標記清除是瀏覽器中最常用的一種垃圾收集方式.當變量進入環境時(例如用var 聲明一個變量),就將這個變量標記為進入環境,當變量離開環境時,就將這個變量標記為離開環境,當然,做這種標記的方式可以有多種,比如可以通過翻轉某個特殊的位來記錄變量合適進入環境,或者使用一個"進入環境的"變量列表及一個"離開環境的"變量列表來跟蹤哪個變量發生了變化.
垃圾回收器會給所有存儲在內存中的變量都加上標記(進入環境),當變量在執行環境中無法被訪問到時,就會加上另一種標記(離開環境),待下一次垃圾回收器進行回收時將回收其占用的內存.
引用計數另一種不太常見的回收方式是引用計數.引用計數就是計算出變量被引用的次數,當一個變量被賦值為一個引用類型的值時,引用類型值的引用次數就加1,當這個變量指向另一個引用類型的值時,引用類型值的引用次數就減1.當垃圾回收器進行檢測時,發現引用類型的值被引用的次數等于0時就會回收其占用的空間.
這種垃圾回收機制會在循環引用中導致嚴重的內存泄露,看下面例子:
function Test(){ var obj1 = new Object(); var obj2 = new Object(); obj1.property = obj2; obj2.property = obj1; }
當Test函數執行完成后,通過引用計數的機制進行垃圾回收時,會發現obj1指向的引用類型值的引用計數為1(被obj2.property引用),obj2指向的引用類型值的引用計數為1(被obj1.property引用),因此這兩個引用類型的值就不會被回收,假如多次執行此函數就會造成嚴重的內存泄露.
為了解決這個問題需要手動釋放內存:
obj1.property = null; obj2.property = null;
IE瀏覽器中IE9以前的版本的BOM和DOM中的對象采用的就是引用計數的回收機制,因此我們在使用時需格外注意.
還有一點需要注意的是:全局環境中的變量只會在應用程序結束(比如關閉瀏覽器)時才會離開執行環境,所以我們需要盡可能的手動釋放無用的變量占用的內存.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/92335.html
摘要:在中雖然對象通過標記清除的方式進行垃圾收,但與對象卻是通過引用計數回收垃圾的,也就是說只要涉及及就會出現循環引用問題。如果垃圾收集例程回收的內存分配量低于,則變量字面量和或數組元素的臨界值就會加倍。 只挑本人重要的寫(有夾雜其他補充) 基本類型和引用類型的值 描述:基本類型值指的是簡單的數據段,而引用類型值指那些可能由多個值構成的對象。 動態的屬性 引用類型的值,我們可以為其添加屬性和...
摘要:局部變量只在函數執行過程中存在。此時,局部變量就沒有存在的必要了,因此可以釋放它們的內存以供將來使用。總結一般情況下,局部變量的生命周期為函數對象執行到執行結束,全局變量的生命周期為瀏覽器打開和關閉。 垃圾收集 JavaScript具有自動垃圾收集機制,也就是說,執行環境會負責管理代碼執行中使用的內存。在C和C++語言中,開發人員一項基本任務就是手工跟蹤內存的使用情況,這是造成許多問題...
摘要:語句中的塊語句對來說,將會指定對象添加到作用域鏈中。在嚴格模式下,初始化未經聲明的變量會導致錯誤。查詢標識符搜索過程從作用域鏈的前端開始,向上逐級查詢與給定名字匹配的標識符。 本文記錄了我在學習前端上的筆記,方便以后的復習和鞏固。 4.1基本類型和引用類型的值 ECMAScript變量可能包含兩種不同數據類型的值:基本類型值和引用類型值。基本類型指的是簡單的數據段,而引用類型值指那些可...
摘要:具體來說就是當執行流進入下列任何一個語句時,作用域鏈就會得到加長語句的塊和語句。這兩個語句都會在作用域鏈的前端添加一個變量對象。對來說,會將指定的對象添加到作用域鏈中。 1. 基本類型和引用類型的值 JavaScript變量可以用來保存兩種類型的值:基本類性值和引用類性值。基本類型值源自以下5種基本數據類型:Undefined、Null、Boolean、Number和String。基本...
摘要:一個閉包就是當一個函數返回時,一個沒有釋放資源的棧區所以參數和變量不會被垃圾回收機制回收。使用不當會很容易造成內存泄露。最后,垃圾回收器完成內存清除工作,銷毀那些帶標記的值并回收它們所占用的內存空間。 1.什么是閉包?閉包有啥特性以及存在什么問題? 概念:閉包是指有權訪問另一個函數作用域中的變量的函數。下面的outer就形成了一個閉包: function outer(){ co...
閱讀 2703·2021-11-25 09:43
閱讀 2085·2021-11-24 09:39
閱讀 1954·2021-11-17 09:33
閱讀 2750·2021-09-27 14:11
閱讀 1840·2019-08-30 15:54
閱讀 3224·2019-08-26 18:27
閱讀 1264·2019-08-23 18:00
閱讀 1810·2019-08-23 17:53