首頁 >web前端 >js教程 >js--變數的作用域

js--變數的作用域

巴扎黑
巴扎黑原創
2017-07-20 14:12:52953瀏覽

身為菜鳥的我,每天學點的感覺還是不錯的。今天學習閉包的過程中看到作用域與作用域鏈這兩個概念,我覺得身為一個有追求的小白,有必要詳細了解下。

變數的作用域

就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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn