你必須知道的Javascript知識(shí)點(diǎn)之"深入理解作用域鏈"的介紹_javascript技巧
來(lái)源:懂視網(wǎng)
責(zé)編:小采
時(shí)間:2020-11-27 21:08:49
你必須知道的Javascript知識(shí)點(diǎn)之"深入理解作用域鏈"的介紹_javascript技巧
你必須知道的Javascript知識(shí)點(diǎn)之"深入理解作用域鏈"的介紹_javascript技巧:示例代碼: 代碼如下:var xxxVar1 = 1; var outer = function(){ var xxxVar2 = 2; var results = []; for(var i = 0; i { var inner = function(){ var xxxVar3 = 3; return xxxVar3 + xxxVar2 +x
導(dǎo)讀你必須知道的Javascript知識(shí)點(diǎn)之"深入理解作用域鏈"的介紹_javascript技巧:示例代碼: 代碼如下:var xxxVar1 = 1; var outer = function(){ var xxxVar2 = 2; var results = []; for(var i = 0; i { var inner = function(){ var xxxVar3 = 3; return xxxVar3 + xxxVar2 +x

示例代碼:
代碼如下:
var xxxVar1 = 1;
var outer = function(){
var xxxVar2 = 2;
var results = [];
for(var i = 0; i< 3; i++)
{
var inner = function(){
var xxxVar3 = 3;
return xxxVar3 + xxxVar2 +xxxVar1 + i;
}
results .push(inner);
}
return results;
}
var xxxVar1 = 100;
var xxxVar2 = 200;
var xxxVar3 = 300;
var results = outer();
results[0]();
results[1]();
results[2]();
執(zhí)行結(jié)果

發(fā)生了什么事情很多人都可能知道上例的執(zhí)行結(jié)果,但是不是所有人都明白為什么會(huì)是這樣的結(jié)果,包括我自己。名詞解釋活動(dòng)對(duì)象:一次函數(shù)調(diào)用開始的時(shí)候,javascript解釋器會(huì)收集函數(shù)體中的所有局部變量(以var形式聲明的變量),將這些局部變量存儲(chǔ)到一個(gè)稱為“活動(dòng)對(duì)象”的對(duì)象里,所有變量都初始為undefined。
代碼示例
代碼如下:
var fun = function(){
alert(name);
var name = '段光偉';
}
當(dāng)執(zhí)行這個(gè)函數(shù)時(shí)候時(shí)(fun()),函數(shù)體還沒(méi)執(zhí)行到,當(dāng)前的活動(dòng)對(duì)象為[{ name: undefined }],因此fun()執(zhí)行的結(jié)果為:
函數(shù)的[scope]屬性:每個(gè)函數(shù)在定義的時(shí)候(生成函數(shù)實(shí)例的時(shí)候)都會(huì)分配一個(gè)[scope]屬性,這個(gè)屬性指向的當(dāng)前的“作用域鏈”。這個(gè)屬性開發(fā)人員是訪問(wèn)不到的,只有javascript能訪問(wèn)。
作用域鏈:當(dāng)函數(shù)調(diào)用時(shí),javascript引擎會(huì)維護(hù)一個(gè)這次調(diào)用的作用域鏈,這個(gè)作用域鏈條是函數(shù)的[scope]指向的作用域鏈加上函數(shù)調(diào)用時(shí)的活動(dòng)對(duì)象,形式如[ 活動(dòng)對(duì)象, 函數(shù)定義時(shí)的作用域鏈條]。
代碼示例
代碼如下:
var a = 1;
//步驟1:[ { a: 1, outer: undefined } ] var outer = function(){
//步驟3:[ { b: undefined, inner: undefined } ,{ a: 1, outer: function } ]
var b = 2;
var inner = function(){
//步驟5:[ {}, { b: 2, inner: function } ,{ a: 1, outer: function } ]
return a + b;
}
//步驟4:[ { b: 2, inner: function } ,{ a: 1, outer: function } ]
return inner();
}
//步驟2:[ { a: 1, outer: function } ]
outer();
作用域鏈規(guī)則規(guī)則1
javascript一般運(yùn)行在一定的宿主中,每個(gè)宿主都會(huì)提供一個(gè)“全局對(duì)象”,或者叫“全局活動(dòng)對(duì)象”,這個(gè)全局對(duì)象是所有作用域鏈的根節(jié)點(diǎn)。
規(guī)則2
“取值操作”(如:alert(xxxVar))的規(guī)則是,沿著作用域鏈依次查找名稱為“xxxVar”的變量,返回第一個(gè)找到的值,如果找不到就拋出異常(ReferenceError: xxxVar is not defined)。
規(guī)則3
“賦值操作”(如:xxxVar = '段光偉')的規(guī)則是,沿著作用域鏈依次查找名稱為“xxxVar”的變量,覆蓋第一個(gè)找到的值,如果找不到就將“xxxVar”添加到全局對(duì)象中。
備注“閉包”這個(gè)概念就是通過(guò)“作用域鏈”實(shí)現(xiàn)的,而C#是通過(guò)編譯器實(shí)現(xiàn)的,.NET并不支持。
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com
你必須知道的Javascript知識(shí)點(diǎn)之"深入理解作用域鏈"的介紹_javascript技巧
你必須知道的Javascript知識(shí)點(diǎn)之"深入理解作用域鏈"的介紹_javascript技巧:示例代碼: 代碼如下:var xxxVar1 = 1; var outer = function(){ var xxxVar2 = 2; var results = []; for(var i = 0; i { var inner = function(){ var xxxVar3 = 3; return xxxVar3 + xxxVar2 +x