2017-12-5.變量提高,變量重名,私有做用域,塊級做用域,內存銷燬,解構賦值,擴展運算符

  • 在做用域造成以後代碼執行以前,將全部的帶var和function關鍵字的變量提早的聲明或定義
    做用域:代碼執行的空間/環境,===棧內存
  • 做用域包括:
  • 全局做用域:瀏覽器打開就會造成全局做用域;
 
  • 私有做用域:一個函數執行造成私有做用域;
 
  •  塊做用域:ES6中新增長的,只要有{}就是塊做用域, 
  • var與function的區別

    var:只提早聲明
    function:即聲明又定義
    let,const的區別

    let,

    沒有變量提高,
    不能夠重複聲明,
    定義的變量不會給window增長屬性

    const:

    沒有變量提高,
    不能夠重複聲明,
    定義的變量不會給window增長屬性,
    定義的是一個常量,定義後不可修改.
    一旦聲明必須賦值

     變量提高的特殊問題

  • 1.自執行函數不會變量提高
    2.等號右邊沒有變量提高
    3.條件判斷的時候,無論條件是否成立都要變量提高,可是,var,function都是隻聲明不定義,當條件成立第一步先給函數賦值
    4.當一個函數當作一個參數的時候不進行變量提高(此時函數已是一個實參了,即便是函數表達式也表明了一個值)
    5.函數中,return後面的雖然不執行,但須要變量提高,可是return出的結果是不進行變量提高的
  • 私有做用域問題
  • 一個函數執行都會造成一個私有做用域,一個函數可執行屢次,每一次都會造成一個私有做用域,每個做用域都沒有關係
  • 閉包:一個私有做用域保護裏面的私有變量不受外界干擾
  • 私有變量:
    1.在私有做用域下聲明過的變量()使用var function,let,const這些關鍵字聲明過的變量
    2.形參也是私有變量
  • 做用域鏈:
    在私有做用域下,遇到變量了,先看看是否是本身的私有變量,若是是,就用本身的私有變量,若是不是,往上一級找,沒有繼續找,一直找到全局做用域爲止,還找不到那就報錯了,這個查找的過程叫做用域鏈
    函數的參數也被當作變量來對待,所以訪問規則與執行環境中的其餘變量相同
  • 塊級做用域:
    1.只要{}包起來的都是塊級做用域
    {},if(){},for{}.while(){}
  • 2.注意
    • function(){} 是私有做用域,不在此中體現
    • 在塊級做用域中,使用var與function定義的變量不能夠重名
    • 塊級做用域針對let d, const,就至關於私有做用域,外面拿不到裏面的聲明的變量,self.d–undefined
    • 暫時性死區:在塊級做用域下,不能夠提早使用未被聲明的變量(使用let和const聲明)

    內存銷燬

  • 1.堆內存的釋放: 地址不會被覆蓋,而是不指向以前的地址,瀏覽器會自動銷燬原來的不在被變量佔用的地址,
    注意:之後開發中後期再也不使用的引用數據類型手動將其賦值爲null
    2.棧內存的釋放:
     
      • 全局做用域: 當關閉瀏覽器的時候
     
      • 私有做用域:
     
        • 銷燬:一個做用域沒有被外界佔用的內容,此時被銷燬
     
        • 不銷燬:當一個私有做用域返回一個地址被外界佔用了,此時這個做用域就不銷燬

    循環綁定事件

    使用自定義屬性的目的是爲了存儲他的索引值
    使用不銷燬的做用域來存儲他的索引值:他的索引當作實參傳給自執行函數,使用私有變量形參來接收,由於這個自執行函數返回一個函數賦值給事件onclick,因此這個自執行函數造成的私有做用域不銷燬,那麼點擊的時候,去找到對應的地址,

     

    擴展運算符

     
     
      • 將數組變成非數組
     
      • 將非數組(有length.有索引,字符串\arguments,元素集合,classList.類名集合,classlist類名集合,set,Map)變成數組
相關文章
相關標籤/搜索