最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript中的變量作用域介紹

 更新時(shí)間:2014年12月31日 09:28:34   投稿:junjie  
這篇文章主要介紹了JavaScript中的變量作用域介紹,本文同時(shí)講解了一個(gè)新概念變量的作用域鏈,需要的朋友可以參考下

對(duì)于變量的作用域(scope),C、Java等語(yǔ)言采取的是“block scope”的方式。與之不同,JavaScript所采取的是“function scope”的方式 — 變量的作用域僅由所處的function決定,與if、for等邏輯塊無(wú)關(guān)。比如,以下這個(gè)例子展示了JavaScript中與C、Java等語(yǔ)言不一樣的行為:

復(fù)制代碼 代碼如下:

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”的語(yǔ)言中,if語(yǔ)句、for語(yǔ)句等邏輯塊結(jié)束后,在這些邏輯塊內(nèi)部定義的變量將會(huì)被銷毀。JavaScript與之不同,只要一個(gè)變量定義在某function內(nèi),那么整個(gè)function內(nèi)的所有代碼均可訪問(wèn)到該變量,即使這些代碼在變量定義之前:

復(fù)制代碼 代碼如下:

function(){
  console.log(a);//undefined
  var a = "test";
  console.log(a);//test
}

在上述例子中,如果function中a從未被定義,那么console.log(a)將拋出ReferenceError。當(dāng)function中對(duì)a進(jìn)行定義后,即使這個(gè)定義在a變量調(diào)用語(yǔ)句之后,對(duì)a的調(diào)用也屬于合法操作(如果對(duì)a變量的定義發(fā)生在調(diào)用語(yǔ)句之后,那么調(diào)用語(yǔ)句中a變量的值為undefined)。事實(shí)上,在function內(nèi)用var關(guān)鍵詞進(jìn)行定義的所有變量,其定義操作都會(huì)被提至function的開頭(賦值操作依然留在var定義的那一行),這在JavaScript中稱之為hoisting。比如,上述代碼就等價(jià)于:

復(fù)制代碼 代碼如下:

function(){
  var a;
  console.log(a);//undefined
  a = "test";
  console.log(a);//test
}

變量的作用域鏈

聯(lián)系JavaScript中變量的儲(chǔ)存,可以很好的理解JS中的“function scope”與hoisting。由于變量是儲(chǔ)存在全局對(duì)象或者函數(shù)調(diào)用對(duì)象上的,因此當(dāng)在function中定義變量時(shí),無(wú)論這個(gè)變量定義在function的什么地方,這次function調(diào)用所使用的函數(shù)調(diào)用對(duì)象中必然會(huì)出現(xiàn)一個(gè)與此變量同名的屬性。如此一來(lái),function中的任何地方都可以訪問(wèn)到該變量。

涉及到函數(shù)調(diào)用,JavaScript中還有一個(gè)更有趣的概念:變量的作用域鏈 — 由于變量是儲(chǔ)存在全局對(duì)象或者函數(shù)調(diào)用對(duì)象上的,因此在訪問(wèn)變量時(shí),可以從多個(gè)對(duì)象上獲取值。以下面的代碼為例:

復(fù)制代碼 代碼如下:

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級(jí)函數(shù)(level-2 function)的內(nèi)部,當(dāng)試圖訪問(wèn)x變量時(shí),程序可以從3個(gè)對(duì)象上搜索相應(yīng)的屬性值:調(diào)用2級(jí)函數(shù)所使用的函數(shù)調(diào)用對(duì)象、調(diào)用1級(jí)函數(shù)所使用的函數(shù)調(diào)用對(duì)象、全局對(duì)象 — 根據(jù)函數(shù)定義的嵌套關(guān)系,JavaScript將生成一個(gè)由全局對(duì)象和函數(shù)調(diào)用對(duì)象所組成的對(duì)象鏈。訪問(wèn)變量時(shí),程序?qū)碾x訪問(wèn)語(yǔ)句最近的那個(gè)對(duì)象開始搜索,如果沒(méi)有搜索到,則在對(duì)象鏈中上一級(jí)的對(duì)象中繼續(xù)進(jìn)行搜索,直至全局對(duì)象。

由于這個(gè)對(duì)象鏈與變量的作用域有關(guān),因此也叫做“作用域鏈”。

如果需要臨時(shí)改變作用域鏈,將某個(gè)對(duì)象插入到作用域鏈的最前端(作為最先訪問(wèn)到的那個(gè)函數(shù)對(duì)象),可以使用with語(yǔ)句:

復(fù)制代碼 代碼如下:

with(o){
  //code use properties of object o.
}

不過(guò),在JavaScript嚴(yán)格模式下,with語(yǔ)句是被禁用的;即使在非嚴(yán)格模式下,也不推薦使用with語(yǔ)句。

相關(guān)文章

  • SWFUpload多文件上傳及文件個(gè)數(shù)限制的方法

    SWFUpload多文件上傳及文件個(gè)數(shù)限制的方法

    這篇文章主要介紹了SWFUpload多文件上傳及文件個(gè)數(shù)限制的方法,較為詳細(xì)的分析了SWFUpload組件實(shí)現(xiàn)多文件上傳的原理、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2016-05-05
  • JavaScript中Map遍歷方法代碼示例

    JavaScript中Map遍歷方法代碼示例

    這篇文章主要給大家介紹了關(guān)于JavaScript中Map遍歷方法的相關(guān)資料,Map是一組鍵值對(duì)的結(jié)構(gòu),具有極快的查找速度,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • JS原型、原型鏈深入理解

    JS原型、原型鏈深入理解

    這篇文章主要針對(duì)javascript中的原型、原型鏈深入理解,原型是JavaScript中一個(gè)比較難理解的概念,本文為大家解決這個(gè)難題,感興趣的小伙伴們可以參考一下
    2016-02-02
  • javascript相等運(yùn)算符與等同運(yùn)算符詳細(xì)介紹

    javascript相等運(yùn)算符與等同運(yùn)算符詳細(xì)介紹

    不管是java、c++、php都有相等運(yùn)算符與等同運(yùn)算符,當(dāng)然javasript也不例外,下面介紹一下
    2013-11-11
  • json屬性名為什么要雙引號(hào)(個(gè)人猜測(cè))

    json屬性名為什么要雙引號(hào)(個(gè)人猜測(cè))

    json屬性名為什么要雙引號(hào)?更加規(guī)范,利于解析、避免class等關(guān)鍵字引起的不兼容問(wèn)題,需要的朋友可以參考下
    2014-07-07
  • js中創(chuàng)建對(duì)象的幾種方式示例介紹

    js中創(chuàng)建對(duì)象的幾種方式示例介紹

    JavaScript中的所有事物都是對(duì)象,本文為大家介紹下JS中創(chuàng)建對(duì)象的幾種方式,如原始方法、工廠方法等等
    2014-01-01
  • Javascript判斷對(duì)象是否相等實(shí)現(xiàn)代碼

    Javascript判斷對(duì)象是否相等實(shí)現(xiàn)代碼

    想判斷2個(gè)js對(duì)象,是不是所有完全相同在表單頁(yè)面應(yīng)用是很常見(jiàn)的,接下來(lái)分享一段判斷代碼,感興趣的你可以參考下哈,希望可以幫助到你
    2013-03-03
  • JS實(shí)現(xiàn)簡(jiǎn)單九宮格抽獎(jiǎng)

    JS實(shí)現(xiàn)簡(jiǎn)單九宮格抽獎(jiǎng)

    這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)簡(jiǎn)單九宮格抽獎(jiǎng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 為什么js中不推薦使用eval函數(shù)(原因分析)

    為什么js中不推薦使用eval函數(shù)(原因分析)

    'eval'函數(shù)是javascript中的一個(gè)內(nèi)置函數(shù),它的主要作用是將傳入的字符串作為代碼來(lái)執(zhí)行,這篇文章主要介紹了為什么js中不推薦使用eval函數(shù),需要的朋友可以參考下
    2023-10-10
  • Redux的基本使用過(guò)程步驟詳解

    Redux的基本使用過(guò)程步驟詳解

    這篇文章主要介紹了Redux的基本使用過(guò)程詳解,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12

最新評(píng)論

玛沁县| 柳河县| 呼图壁县| 常德市| 贵南县| 新昌县| 安阳市| 谷城县| 吉木乃县| 永仁县| 三河市| 厦门市| 福鼎市| 雷山县| 凤冈县| 津市市| 盘锦市| 麻栗坡县| 沙洋县| 收藏| 阿克苏市| 兴安县| 凭祥市| 博客| 定西市| 南江县| 滦南县| 莒南县| 玉田县| 邓州市| 九台市| 济宁市| 宿松县| 新平| 略阳县| 泸州市| 保亭| 南江县| 遵义市| 湄潭县| 荥经县|