西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

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

Javascript中的“作用域鏈”知識分享

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

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

  • 類型:瀏覽輔助大。5.2M語言:中文 評分: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é)果,但是不是所有人都明白為什么會是這樣的結(jié)果,包括我自己。

名詞解釋

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


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


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

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

作用域鏈:當(dāng)函數(shù)調(diào)用時(shí),javascript引擎會維護(hù)一個(gè)這次調(diào)用的作用域鏈,這個(gè)作用域鏈條是函數(shù)的[scope]指向的作用域鏈加上函數(shù)調(diào)用時(shí)的活動對象,形式如[ 活動對象, 函數(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è)宿主都會提供一個(gè)“全局對象”,或者叫“全局活動對象”,這個(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)評論

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

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

    熱門評論

    最新評論

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

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