国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

JavaScript中的變量作用域介紹

2024-05-06 16:13:20
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了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.
}

 

 

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 松滋市| 龙井市| 洛宁县| 佛山市| 隆回县| 叶城县| 华池县| 芜湖市| 雷州市| 喀喇沁旗| 平昌县| 门头沟区| 射洪县| 阳城县| 宁德市| 称多县| 嵊泗县| 兰坪| 福贡县| 巴里| 两当县| 广州市| 高碑店市| 古田县| 黄大仙区| 南溪县| 博湖县| 昔阳县| 广安市| 泽库县| 榕江县| 鹤峰县| 区。| 永靖县| 灵川县| 台北县| 乌拉特后旗| 肃宁县| 确山县| 会宁县| 大余县|