函數

  • arguments修改值會修改對應參數的值,解決辦法是use strict
  • 函數上下文
    對于方法而言 即為方法所在的對象
    對于頂級函數而言,嚴格模式是undefined,非嚴格模式是window
    對于構造函數而言,是一個新創建的對象實例
    對于apply call 是傳入的對象
    對于bind 是綁定的對象,返回的是函數
  • 箭頭函數的this與聲明所在的上下文的相同

閉包

  • 閉包用途

    1. 封裝私有變量
    2. 處理回調函數
      閉包使用原因:可以封裝狀態,不污染全局變量,寫法簡便,可復用性強
  • 執行上下文
    全局執行上下文和函數執行上下文

  • const var let
    通過const定義的基本數據類型的值只能設置一次
    const定義的對象不可變,但屬性值可以變
    let 和var都定義變量 值可以變,var有變量提升,let沒有,let定義的變量在聲明之前使用會陷入暫時性死區報錯
    從語法環境來說 var定義的變量是在距離最近的函數內部或是在全局此法環境中定義的,這也是變量提升的原因,var會忽略塊級作用域,let和const直接在最近的此法環境中定義變量(包括塊級作用域,循環內,函數內或全局環境內)

  • 函數的提升優先級
    javascript的代碼執行是分兩個階段的

    1. 第一階段,沒有執行代碼,JavaScript引擎會訪問并注冊當前詞法環境中所聲明的變量和函數
    2. 第二階段 根據變量類型和環境類型具體執行代碼
      所以在代碼執行前,函數已經存在,函數的聲明順序無關緊要
      注意:只針對函數聲明有效,函數表達式和箭頭函數是在執行過程中定義的,所以都不行

生成器和promise

  • 調用生成器并不會執行生成器函數,會創建迭代器對象,與生成器通信