摘要:作用域鏈中的下一個變量對象來自包含外部環境,而再下一個變量對象則來自下一個包含環境。這樣,一直延續到全局執行環境全局執行環境的變量對象始終都是作用域鏈中的最后一個對象標識符解析沿作用域鏈一級一級搜索標識符。
一、寫在前面
最近研究了創建Android虛擬機、vscode結合weex開發Android APP、Vmware裝MAC虛擬機的事,看的內容不夠多,接下來加油
二、變量、作用域和內存問題 2.1 基本類型、引用類型
變量類型:
基本類型: 簡單數據段,按值訪問的,可操作變量中的實際值
引用類型:對象,按引用訪問,操作對象的引用,能動態添加屬性
變量復制:
基本類型:直接分配兩個內存空間,互不影響
引用類型:復制了指針,指向堆中同一對象,相互影響
傳參(見示例):
基本類型傳值,互不影響
引用類型傳地址,相互影響
// 示例 function?setName(obj)?{ // 指向person,添加屬性name ????obj.name?=?"Nicholas"; ????// 指針指向新的內存空間 ????obj?=?new?Object(); ????obj.name?=?"Greg"; // 函數執行完畢后,局部對象立即銷毀 } var?person?=?new?Object(); setName(person); alert(person.name);????//"Nicholas"
檢測類型
typeOf特殊:null返回object
instanceof:引用類型檢測,(某實例) instanceof (某類型)
2.2 執行環境、作用域
執行環境:定義變量或函數有權訪問的其他數據范圍,決定行為。中有變量對象,保存環境中定義的所有變量和函數,環境銷毀,變量、函數銷毀
全局執行環境,web中為window對象
局部執行環境,執行流進入函數,函數環境被推入環境棧,執行后,棧將其環境彈出,控制權返回之前的執行環境
作用域鏈: 在環境中執行代碼,會創建變量對象的作用域鏈,保證(有權訪問當前環境的)變量和對象有序訪問
作用域鏈的前端,始終都是當前執行的代碼所在環境的變量對象。如果這個環境是函數,則將其活動對象(activation
object)作為變量對象?;顒訉ο笤谧铋_始時只包含一個變量,即arguments對象(這個對象在全局環境中是不存在的)。作用域鏈中的下一個變量對象來自包含(外部)環境,而再下一個變量對象則來自下一個包含環境。這樣,一直延續到全局執行環境;全局執行環境的變量對象始終都是作用域鏈中的最后一個對象
標識符解析:沿作用域鏈一級一級搜索標識符。從作用域鏈前端開始,逐級向后,直到找到標識符為止
內外關系:
內部環境可以通過作用域鏈訪問所有外部環境,外部環境不能訪問內部環境中的任何變量或函數
每個環境可以向上級搜素,但不能向下搜索進入另一個執行環境
2.3 延長作用域鏈在作用域鏈前端加臨時變量對象,執行后移除
try-catch中catch
with
function aaa( ) { var qs = "?id=12"; // 引用location,with內部可用location的所有屬性和方法 with(location) { // href為locaiton.href var url = href + qs; } // 在aaa( )內可拿到with( )內定義的url return url; }
catch特殊情況:IE8以前catch的錯誤對象會添加至執行環境的變量對象,catch外也能訪問(IE9修復了)
2.4 沒有塊級作用域{ } 封閉的代碼塊中定義的變量,執行后沒有被銷毀,依舊存在于{ }外部執行環境中
聲明變量
var:自動添加到最接近的環境中。沒有var直接聲明,添加到全局環境中(嚴格模式下導致錯誤,不推薦)
查詢標識符
從作用域鏈前端開始,向上逐級查詢,直至匹配為止(先自身再向上)
訪問局部變量比訪問全局變量更快
2.5 垃圾收集執行環境管理著代碼執行過程中使用的內存
自動垃圾收集機制:實現所需內存分配、無用內存回收,自動管理。固定時間間隔,周期性檢索不再繼續使用的變量,打標記,釋放其占用的內存
回收策略
標記清除(主流)
變量進入環境、離開環境,標記不同
標記方式:翻轉某位,或以環境列表、離開環境列表區分,或其他
運行機制:內存中全部變量加標記,再去掉環境中的、被環境中引用的變量的標記,剩下還有標記的,準備刪除,垃圾收集器清除內存,銷毀值,回收空間
引用計數(不常見)
跟蹤每個值被引用的次數
計數規則:引用類型的值賦給一個變量,引用次數加一;已經引用的變量不再引用它,引用次數減一
運行機制:垃圾收集器運行,釋放引用次數為0的值所占的內存。
特殊情況:
循環引用(例:兩對象間相互引用,則引用次數永不為0,無法銷毀)
IE9之前,BOM、DOM對象以COM(使用引用計數策略)形式實現,循環引用后刪除DOM,對應值也不會回收(通過賦值null,手動斷開循環引用解決)。IE9后,BOM、DOM轉為真正的js對象,避免了該問題
性能問題
IE7之前:內存分配量達到任一臨界值(256變量、4096對象數組、64K字符串)則回收,缺點:如一直在臨界值之上,則一直回收
IE7修正:臨界值動態修正,初始與之前相等,回收的分配量低于15%,臨界值加倍,回收的內存分配量85%,臨界值恢復初始
手動觸發方式(不推薦):
// 手動觸發方式 // IE window.CollectGarbage(); // Opear7~ window.opera.collect();
管理內存
內存分配:給web瀏覽器的少于給桌面應用的,防止系統崩潰
優化內存占用:只保存必要數據,不用的置null(解除引用,給全局中的用,局部的會自動銷毀),等待下一次垃圾回收
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/104964.html
摘要:具體說就是執行流進入下列任何一個語句時,作用域鏈就會得到加長語句的塊。如果局部環境中存在著同名的標識符,就不會使用位于父環境中的標識符訪問局部變量要比訪問全局變量更快,因為不用向上搜索作用域鏈。 基本類型和引用類型的值 ECMAscript變量包含 基本類型值和引用類型值 基本類型值值的是基本數據類型:Undefined, Null, Boolean, Number, String ...
摘要:局部變量只在函數執行過程中存在。此時,局部變量就沒有存在的必要了,因此可以釋放他們所占的內存以供他們使用。引用計數的含義是跟蹤記錄每個值被引用的次數。這一做法適合于大多數全局變量和局部變量的屬性。 基本類型和引用類型的值 ECMAScript變量可能包含兩種不同數據類型的值:基本類型值和引用類型值?;绢愋椭抵傅氖呛唵蔚臄祿危妙愋偷闹抵改切┛赡苡卸鄠€值構成的對象。 動態的屬性 ...
摘要:因此,所有在方法中定義的變量都是放在棧內存中的當我們在程序中創建一個對象時,這個對象將被保存到運行時數據區中,以便反復利用因為對象的創建成本通常較大,這個運行時數據區就是堆內存。 上一篇:《javascript高級程序設計》筆記:繼承近幾篇博客都會圍繞著圖中的知識點展開 showImg(https://segmentfault.com/img/bVY0C4?w=1330&h=618);...
摘要:閉包是怎么通過作用域鏈霸占更多內存的本文是作者學習高級程序設計第一小節的一點個人理解,詳細教程請參考原教材。函數執行過程創建了一個函數的活動對象,作用域鏈的最前端指向這個對象。函數執行完畢返回值后執行環境作用域鏈和活動對象一并銷毀。 JavaScript 閉包是怎么通過作用域鏈霸占更多內存的? 本文是作者學習《JavaScript 高級程序設計》7.2第一小節的一點個人理解,詳細教程請...
摘要:定義函數表達式的方式有兩種函數聲明。不過,這并不是匿名函數唯一的用途??梢允褂妹瘮当磉_式來達成相同的結果閉包匿名函數和閉包是兩個概念,容易混淆。匿名函數的執行環境具有全局性,因此其對象通常指向通過改變函數的執行環境的情況除外。 定義函數表達式的方式有兩種: 函數聲明。它的重要特征就是 函數聲明提升(function declaration hoisting) 即在執行代碼之前會...
閱讀 3315·2021-11-12 10:36
閱讀 2467·2021-11-02 14:43
閱讀 2146·2019-08-30 14:23
閱讀 3462·2019-08-30 13:08
閱讀 919·2019-08-28 18:09
閱讀 3129·2019-08-26 12:22
閱讀 3141·2019-08-23 18:24
閱讀 2017·2019-08-23 18:17