原理:代碼執行以前,js會把代碼中帶var 和帶 function的變量提早聲明數組
var:只聲明不定義 默認值是undefined瀏覽器
function:既聲明又定義函數
變量提高對於條件語句來講,無論是否成立,都會進行變量提高this
在條件語句或者循環語句中的大括號包着的function聲明,高版本瀏覽器只聲明不定義cdn
變量提高只提高=左邊的,return後邊的也不提高blog
let和const不存在變量提高,可是有暫時性死循環:就是在聲明以前不能調用內存
想用他們聲明的變量 要在下邊使用 :就是先聲明在使用作用域
let const var 三者之間的區別字符串
1.var能夠重複聲明,生命的變量存在提高,聲明的變量會在window下增長一個對應的屬性。it
而let 和const都不能夠重複聲明,不存在變量提高,不會在window下增長屬性。可是let和const能夠識別塊級做用域
2.做用域:就是一塊棧內存
堆內存:存儲引用類型
棧內存:存儲值類型(私有做用域),也提供代碼的運行環境
全局做用域:頁面一打開的時候就會造成一個全局做用域,一根頁面只有一個全局做用域
私有做用域:函數執行的時候就會造成私有做用域
塊級做用域:判斷語句、循環語句、大括號包起來的部分:let、const能夠識別:在這裏邊聲明的function只聲明不定義。
上級做用域:(只有私有做用域纔有)函數執行的那個私有做用域,通常都會存在一個上級做用域:上級做用域是誰?跟函數在哪執行麼有關係,只跟函數在哪一個做用域定義有關。
函數執行:先有形參賦值,再有變量提高。
做用域鏈:私有做用域的變量有可能不是該私有做用域的私有變量,這時該變量對應的取值,先在本身的做用域查找,若是找不到就須要去上一級的做用域查找,還找不到,就去window找,扔找不到就會報錯。(私有做用域沒有形參也沒有私有變量,這時就往上級做用域查找)
上述的做用域鏈這種機制就是
函數執行的過程:先開闢一個私有做用域(棧內存),而後形參賦值,變量提高,代碼從上到下執行。
全局變量:全局做用域聲明的變量
私有變量:私有做用域聲明的變量(形參也是私有變量)
若是一個函數有形參也有實參:實參就是全局定義的值