做用域,做用域鏈,垃圾收集,js解析

  變量中包含基本數據類型引用數據類型,基本類型指簡單的數據值,引用類型由多個值構成的對象.
  引用類型能夠爲其添加屬性和方法,也能夠改變和刪除屬性和方法.
複製變量值:
    基本類型:一個變量向另外一個變量複製基本類型的值,會在變量對象上建立一個新值,並把該值分配到新變量分配的位置上,二者任何操做不會互相影響.
    引用類型:當一個變量向另外一個變量複製引用類型的值時,一樣也會存儲在變量的值複製一份放到位新變量分配的空間中,可是不一樣的視,這個值的副本只是一個指針,而這個指針指向存儲在堆中的一個對象,兩個變量引用一個對象,改變其中一個變量,另外一個也會隨之改變.
傳遞參數:
    全部函數的參數都是按值傳遞的.
    在向函數的參數傳遞基本類型值時,被傳遞的值會被複制給一個局部的變量(命名參數.arguments對象中的一個元素)
    在向參數傳遞引用類型的值時,即便是按值傳遞,指向的也是同一個對象,由於變量指向的對象在堆內存中只有一個.
    typeof操做符是一個肯定一個變量是字符中數值,布爾值.undefined的最佳工具,若是變量是null或對象,則會返回object
    instanceof操做符是一個肯定變量是引用類型的操做符.
        instanceof檢測引用類型和object構造函數時  return true 
        instanceof檢測基本數據類型值時            return false
 
做用域:
    最外圍的做用域爲全局做用域,根據宿主環境不一樣,其表示做用域的對象也不一樣,未聲明的變量皆爲全局變量.
    除全局做用域之外的全部做用域皆爲局部做用域,var聲明的變量爲局部變量
    js中沒有塊級做用域一說
做用域鏈:
    是由局部做用域中的深層做用域由內向外冒泡尋找,一直到全局做用域.
    局部做用域能夠訪問全局做用域,可是全局做用域不能夠訪問局部做用域中的變量.
延長做用域鏈
    with()延長做用域鏈
    實例
var person={};
    with(person){
        name="xiaoming";
        sex="male";
      }
基本數據類型
引用數據類型
不可修改
能夠修改
保存在棧內存
保存在堆內存,指針地址保存在棧內存中
按值訪問
按引用訪問
比較時,值相等就相等
比較時,同一引用才相等
複製時,建立一個副本
複製時,,複製的其實只是一個指針
按值傳遞參數
按值傳遞參數
用typeof檢測類型
用instanceof檢測類型

 

 
垃圾收集:
        js是全自動的,沒必要像c和c++之類手動收集垃圾,可讓咱們少操心了.
        js中垃圾收集分爲兩種,一種是標記清除法,還有一種是引用計數.
    標記清除是垃圾收集器在運行的時候會給在內存中的全部變量都打上標記,而後,它會去掉環境中的變量和被環境中變量引用的變量的標記,而在此以後再被添加上標記的變量就被視爲準備刪除的變量,緣由是環境中的變量已經沒法訪問到這些變量了,最後完成垃圾收集.
    引用計數是跟蹤每一個值被引用的次數,當聲明瞭一個變量並將一個引用類型值賦給該變量時,該值引用的次數加1,反之減1,爲0時,說明沒法訪問,收回所佔用內存.
可是會涉及循環引用的問題,循環引用會致使永遠都不會被清理,一直佔用內存,可將值設置爲null來手動解除引用.
js解析
  1.預解析
     當前做用域var和function關鍵詞的會事先聲明(變量提高),函數的優先級比var聲明的優先級高,var聲明的變量會被提高爲undefined,聲明函數會把整個函數提高到最前面.
  2.逐行解讀
我的理解,歡迎大佬們給提意見!!
相關文章
相關標籤/搜索