標籤:add ott global 全域變數 範圍鏈 define 覆蓋 function size
作為一名菜鳥的我,每天學點的感覺還是不錯的。今天學習閉包的過程中看到範圍與範圍鏈這兩個概念,我覺得作為一名有追求的小白,有必要詳細瞭解下。
變數的範圍
就js變數而言,有全域變數和局部變數。這裡我覺得這個按字面意思理解就行了.......下面舉個例子
var message = "今天我做的糯米蒸排骨"; //定義一個全域變數function doL(){ var ss = "俠客行很好看"; //定義一個局部變數 alert(message); //輸出"今天我做的糯米蒸排骨",在函數中可以引用到全域變數 function alertDo(){ alert(ss); } alertDo(); //輸出"俠客行很好看",這就涉及變數的範圍了};doL();alertDo(); //沒法輸出 alertDo is not definedalert(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學習--變數範圍