身為菜鳥的我,每天學點的感覺還是不錯的。今天學習閉包的過程中看到作用域與作用域鏈這兩個概念,我覺得身為一個有追求的小白,有必要詳細了解下。
變數的作用域
就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--變數的作用域的詳細內容。更多資訊請關注PHP中文網其他相關文章!