1. js (1,2) 分組選中符,結果是2,以最後一個爲準函數
2.執行上下文.變量對象(Variable Object)對象
咱們已經說過,每次執行(注意是執行而不是聲明!)一個函數以前,執行引擎都會建立一個上下文對象。建立上下文對象的時候,就會建立它的一個重要屬性:變量對象。 建立變量對象的過程是這樣:內存
創建arguments對象:屬性名是'0'、'1'、'2'.....,屬性值就是實際傳入的參數。此外arguments.length是實際參數的個數。 找到這個將要執行的函數內的全部函數聲明,儲存在變量對象中,屬性名就是函數名,屬性值就是函數的引用(所在的內存地址)。若是有多個同名的函數聲明,後出現的函數覆蓋前面的屬性值。 找到這個將要執行的函數內的全部變量聲明,儲存在變量對象中,屬性名就是變量名,屬性值是undefined。作用域
變量提高:建立變量對象的時候,讀取到做用域內存在var變量,變量對象裏面建立var變量屬性,並賦值爲undefined,於是var變量能夠在被聲明前使用,let則會建立一個uninit的屬性,調用出錯it
這也是函數在聲明前調用沒有任何問題的緣由變量
js中,變量對象在進入做用域建立,因此for和if等沒有獨自做用域的{},內部變量與外部變量都統一被變量對象讀取,從而形成沒法造成塊級做用域引用