變量、做用域、內存---part5

咱們上一部分簡單的提到了做用域的概念,在一個函數被解析的時候會在做用域的範圍中產生一個環境變量的對象,函數的全部的取值和賦值的操做都在這個環境變量中去操做編程

咱們先定義一個函數裏面聲明一個變量叫outerValue再在函數的裏面再建立一個函數調用該變量

咱們在全局嘗試獲取到函數裏面的變量程序的解析立馬會報錯
那麼咱們先問一個終極的問題,爲何要有做用域的區分?你們無論在那個做用域裏面隨意調用不美滋滋麼?其實個人理解是,做用域成功的把js的編程模式編程了「面向對象」的黑盒模式,別人看到你的代碼裏面封裝好的一個函數,只須要管它的入參是什麼,它的輸出是什麼,剩下的關於這個函數是怎麼被設計的不用管,拿來用就好,其實現實世界也是這樣的,我如今用的筆記本,我只管學會在鍵盤上碼字,不用瞭解CPU是怎麼處理我觸發的動做的過程
JS做用域的特色和其餘的編程語言大有不同,JS做用域裏面沒有塊級做用域

for循環裏面並無造成一個獨立的塊級做用域,因此咱們在for循環的外面照樣能把for循環裏面的變量打印出來
JS雖然沒有塊級做用域,可是咱們能夠利用js獨特的做用域鏈的概念用函數模擬塊級做用域

可是咱們再新的語法(也不是很新)ES6中產生了塊級做用域的限制,ES6產生了let和const兩個特殊的聲明變量的方式,與var這種聲明變量的方式最大的不一樣是,var能夠變量的聲明提高而let和const沒有變量的聲明提高,等等!!!聲明提高又是啥??

注意看這兩行代碼咱們在第一行的時候調用了在第二行才用var去聲明出來的i變量可是咱們代碼解析並無報錯,而是爆出了undefined!!!!這是由於因爲咱們js沒有塊級做用域的緣由咱們全部的變量聲明都會被提到一切程序解析的最前面

也就是咱們其實代碼解析的順序對於瀏覽器來講是這個樣子滴~,可是自從有了ES6裏面的let和const就有了塊級做用域,這樣的變量提高就沒有了

咱們照樣用這樣的順序去寫代碼可是報錯了,錯誤的緣由翻譯過來是「沒法獲取到J,請先初始化」
相關文章
相關標籤/搜索