函數
- arguments修改值會修改對應參數的值,解決辦法是use strict
- 函數上下文
對于方法而言 即為方法所在的對象
對于頂級函數而言,嚴格模式是undefined,非嚴格模式是window
對于構造函數而言,是一個新創建的對象實例
對于apply call 是傳入的對象
對于bind 是綁定的對象,返回的是函數 - 箭頭函數的this與聲明所在的上下文的相同
閉包
-
閉包用途
- 封裝私有變量
- 處理回調函數
閉包使用原因:可以封裝狀態,不污染全局變量,寫法簡便,可復用性強
-
執行上下文
全局執行上下文和函數執行上下文 -
const var let
通過const定義的基本數據類型的值只能設置一次
const定義的對象不可變,但屬性值可以變
let 和var都定義變量 值可以變,var有變量提升,let沒有,let定義的變量在聲明之前使用會陷入暫時性死區報錯
從語法環境來說 var定義的變量是在距離最近的函數內部或是在全局此法環境中定義的,這也是變量提升的原因,var會忽略塊級作用域,let和const直接在最近的此法環境中定義變量(包括塊級作用域,循環內,函數內或全局環境內) -
函數的提升優先級
javascript的代碼執行是分兩個階段的- 第一階段,沒有執行代碼,JavaScript引擎會訪問并注冊當前詞法環境中所聲明的變量和函數
- 第二階段 根據變量類型和環境類型具體執行代碼
所以在代碼執行前,函數已經存在,函數的聲明順序無關緊要
注意:只針對函數聲明有效,函數表達式和箭頭函數是在執行過程中定義的,所以都不行
生成器和promise
- 調用生成器并不會執行生成器函數,會創建迭代器對象,與生成器通信