JavaScript中的變數範圍介紹,javascript變數

來源:互聯網
上載者:User

JavaScript中的變數範圍介紹,javascript變數

對於變數的範圍(scope),C、Java等語言採取的是“block scope”的方式。與之不同,JavaScript所採取的是“function scope”的方式 — 變數的範圍僅由所處的function決定,與if、for等邏輯塊無關。比如,以下這個例子展示了JavaScript中與C、Java等語言不一樣的行為:

複製代碼 代碼如下:
function(){
  var s = 42;//s is visible throughout function
  if (s > 3) {
    var x = "test";//x is visible throughout function
    for(var i=0; i<10; i++){
      console.log(i);
    }
    console.log(i);//i is visible throughout function
  }
  console.log(i);
  console.log(x);
}

在C、Java等“block scope”的語言中,if語句、for語句等邏輯塊結束後,在這些邏輯塊內部定義的變數將會被銷毀。JavaScript與之不同,只要一個變數定義在某function內,那麼整個function內的所有代碼均可訪問到該變數,即使這些代碼在變數定義之前:

複製代碼 代碼如下:
function(){
  console.log(a);//undefined
  var a = "test";
  console.log(a);//test
}

在上述例子中,如果function中a從未被定義,那麼console.log(a)將拋出ReferenceError。當function中對a進行定義後,即使這個定義在a變數調用語句之後,對a的調用也屬於合法操作(如果對a變數的定義發生在調用語句之後,那麼調用語句中a變數的值為undefined)。事實上,在function內用var關鍵詞進行定義的所有變數,其定義操作都會被提至function的開頭(賦值操作依然留在var定義的那一行),這在JavaScript中稱之為hoisting。比如,上述代碼就等價於:

複製代碼 代碼如下:
function(){
  var a;
  console.log(a);//undefined
  a = "test";
  console.log(a);//test
}

變數的範圍鏈

聯絡JavaScript中變數的儲存,可以很好的理解JS中的“function scope”與hoisting。由於變數是儲存在全域對象或者函數調用對象上的,因此當在function中定義變數時,無論這個變數定義在function的什麼地方,這次function調用所使用的函數調用對象中必然會出現一個與此變數同名的屬性。如此一來,function中的任何地方都可以訪問到該變數。

涉及到函數調用,JavaScript中還有一個更有趣的概念:變數的範圍鏈 — 由於變數是儲存在全域對象或者函數調用對象上的,因此在訪問變數時,可以從多個對象上擷取值。以下面的代碼為例:

複製代碼 代碼如下:
var x = "test";
function(){
  //level-1 function
  var x = "temp";
  function(){
    //level-2 function
    var x = "real";
    //try to access x here. x will be "real".
  }
}

在上述代碼中2級函數(level-2 function)的內部,當試圖訪問x變數時,程式可以從3個對象上搜尋相應的屬性值:調用2級函數所使用的函數調用對象、調用1級函數所使用的函數調用對象、全域對象 — 根據函數定義的嵌套關係,JavaScript將產生一個由全域對象和函數調用對象所組成的對象鏈。訪問變數時,程式將從離訪問語句最近的那個對象開始搜尋,如果沒有搜尋到,則在對象鏈中上一級的對象中繼續進行搜尋,直至全域對象。

由於這個對象鏈與變數的範圍有關,因此也叫做“範圍鏈”。

如果需要臨時改變範圍鏈,將某個對象插入到範圍鏈的最前端(作為最先訪問到的那個函數對象),可以使用with語句:

複製代碼 代碼如下:
with(o){
  //code use properties of object o.
}

不過,在JavaScriptstrict 模式下,with語句是被禁用的;即使在非strict 模式下,也不推薦使用with語句。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.