js學習--變量作用域
阿新 • • 發佈:2017-07-13
有意 window cti 很好 padding blog oca 菜鳥 而是 屬性並賦值。
作為一名菜鳥的我,每天學點的感覺還是不錯的。今天學習閉包的過程中看到作用域與作用域鏈這兩個概念,我覺得作為一名有追求的小白,有必要詳細了解下。
變量的作用域
就js變量而言,有全局變量和局部變量。這裏我覺得這個按字面意思理解就行了.......下面舉個例子
var message = "今天我做的糯米蒸排骨"; //定義一個全局變量 function doL(){ var ss = "俠客行很好看"; //定義一個局部變量 alert(message); //輸出"今天我做的糯米蒸排骨",在函數中可以引用到全局變量 function alertDo(){ alert(ss); } alertDo(); //輸出"俠客行很好看",這就涉及變量的作用域了 }; doL(); alertDo(); //沒法輸出 alertDo is not defined alert(message); //可以輸出"今天我做的糯米蒸排骨"
這邊有2個很有意思的地方
1.當變量不用var聲明的時候我們實際上聲明了一個全局變量,好吧,這是錯誤的,看下面,num是一個全局變量,
而 mum = 1;
事實上是對屬性賦值操作。首先,它會嘗試在當前作用域鏈(如在方法中聲明,則當前作用域鏈代表全局作用域和方法局部作用域etc。。。)中解析 mum ; 如果在任何當前作用域鏈中找到mum ,則會執行對mum 屬性賦值; 如果沒有找到mum ,它才會在全局對象(即當前作用域鏈的最頂層對象,如window對象)中創造mum
註意!它並不是聲明了一個全局變量,而是創建了一個全局對象的屬性。由於變量聲明自帶不可刪除屬性,比較var num = 1 跟 num = 1,前者是變量聲明,帶不可刪除屬性,因此無法被刪除;後者為全局變量的一個屬性,因此可以從全局變量中刪除。
var num =1; mum = 1;
2.變量聲明會提前到函數頂部,其實之前已經遇到過了
var scope="global"; function t(){ console.log(scope); var scope="local" console.log(scope); } t();
它首先會輸出undefined,然後才是scope,它會將變量提前聲明並且覆蓋局部變量,等價於下面這種情況
var scope="global"; function t(){ var scope; console.log(scope); scope="local" console.log(scope); } t();
js學習--變量作用域