日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
      軟件
      軟件
      文章
      搜索

      首頁編程開發(fā)javascript|JQuery → Javascript中的“作用域鏈”知識(shí)分享

      Javascript中的“作用域鏈”知識(shí)分享

      相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來源:西西整理時(shí)間:2013/4/22 8:37:15字體大。A-A+

      作者:西西點(diǎn)擊:20次評(píng)論:2次標(biāo)簽: 作用

      • 類型:瀏覽輔助大小:5.2M語言:中文 評(píng)分:10.0
      • 標(biāo)簽:
      立即下載

      代碼示例

      1 var xxxVar1 = 1;
       2 var outer = function(){ 
       3    var xxxVar2 = 2;
       4 
       5    var results = [];
       6    
       7    for(var i = 0; i< 3; i++)
       8    {
       9       var inner = function(){
      10          var xxxVar3 = 3;
      11          return xxxVar3 + xxxVar2 +xxxVar1 + i;
      12       }
      13       results .push(inner);
      14    }
      15 
      16    return results;
      17 }
      18 
      19 var xxxVar1 = 100;
      20 var xxxVar2 = 200;
      21 var xxxVar3 = 300;
      22 var results = outer();
      23 results[0]();
      24 results[1]();
      25 results[2]();

      執(zhí)行結(jié)果

      發(fā)生了什么事情

      很多人都可能知道上例的執(zhí)行結(jié)果,但是不是所有人都明白為什么會(huì)是這樣的結(jié)果,包括我自己。

      名詞解釋

      活動(dòng)對象:一次函數(shù)調(diào)用開始的時(shí)候,javascript解釋器會(huì)收集函數(shù)體中的所有局部變量(以var形式聲明的變量),將這些局部變量存儲(chǔ)到一個(gè)稱為“活動(dòng)對象”的對象里,所有變量都初始為undefined。
      代碼示例


      1 var fun = function(){
      2    alert(name);
      3    var name = '段光偉';
      4 }


      當(dāng)執(zhí)行這個(gè)函數(shù)時(shí)候時(shí)(fun()),函數(shù)體還沒執(zhí)行到,當(dāng)前的活動(dòng)對象為[{ name: undefined }],因此fun()執(zhí)行的結(jié)果為:

      函數(shù)的[scope]屬性:每個(gè)函數(shù)在定義的時(shí)候(生成函數(shù)實(shí)例的時(shí)候)都會(huì)分配一個(gè)[scope]屬性,這個(gè)屬性指向的當(dāng)前的“作用域鏈”。這個(gè)屬性開發(fā)人員是訪問不到的,只有javascript能訪問。

      作用域鏈:當(dāng)函數(shù)調(diào)用時(shí),javascript引擎會(huì)維護(hù)一個(gè)這次調(diào)用的作用域鏈,這個(gè)作用域鏈條是函數(shù)的[scope]指向的作用域鏈加上函數(shù)調(diào)用時(shí)的活動(dòng)對象,形式如[ 活動(dòng)對象, 函數(shù)定義時(shí)的作用域鏈條]。
      代碼示例


       1 var a = 1;
       2 //步驟1:[ { a: 1, outer: undefined } ]
       3 
       4 var outer = function(){
       5    //步驟3:[ { b: undefined, inner: undefined } ,{ a: 1, outer: function } ]
       6    var b = 2;
       7    var inner = function(){
       8       //步驟4:[ {}, { b: 2, inner: function } ,{ a: 1, outer: function } ]
       9       return a + b;
      10    }
      11 
      12    //步驟3:[ { b: 2, inner: function } ,{ a: 1, outer: function } ]
      13    return inner();
      14 }
      15 
      16 //步驟2:[ { a: 1, outer: function } ]
      17 outer();


      作用域鏈規(guī)則

      規(guī)則1

      javascript一般運(yùn)行在一定的宿主中,每個(gè)宿主都會(huì)提供一個(gè)“全局對象”,或者叫“全局活動(dòng)對象”,這個(gè)全局對象是所有作用域鏈的根節(jié)點(diǎn)。

      規(guī)則2

       “取值操作”(如:alert(xxxVar))的規(guī)則是,沿著作用域鏈依次查找名稱為“xxxVar”的變量,返回第一個(gè)找到的值,如果找不到就拋出異常(ReferenceError: xxxVar is not defined)。

      規(guī)則3

      “賦值操作”(如:xxxVar = '段光偉')的規(guī)則是,沿著作用域鏈依次查找名稱為“xxxVar”的變量,覆蓋第一個(gè)找到的值,如果找不到就將“xxxVar”添加到全局對象中。

      備注

      “閉包”這個(gè)概念就是通過“作用域鏈”實(shí)現(xiàn)的,而C#是通過編譯器實(shí)現(xiàn)的,.NET并不支持。

        相關(guān)評(píng)論

        閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

        • 8 喜歡喜歡
        • 3 頂
        • 1 難過難過
        • 5 囧
        • 3 圍觀圍觀
        • 2 無聊無聊

        熱門評(píng)論

        最新評(píng)論

        發(fā)表評(píng)論 查看所有評(píng)論(2)

        昵稱:
        表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
        字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過審核才能顯示)