寫在最前面
作用域精解
[[scope]] : 每個(gè)JavaScript函數(shù)都是一個(gè)對(duì)象砸琅。對(duì)象中有些屬性我們可以訪問(wèn)贵白,但有些不可以百拓,這些屬性僅提供JavaScript引擎存取趴捅,[[scope]]就是其中一個(gè)羔味。
[[scope]]指的就是我們所說(shuō)的作用域,其中存儲(chǔ)了運(yùn)行期上下文的集合
作用域鏈 : [[scope]]中存儲(chǔ)的執(zhí)行期上下文對(duì)象的集合蛆橡,這個(gè)集合呈鏈?zhǔn)芥溄樱覀儼堰@種鏈?zhǔn)芥溄咏凶鲎饔糜蜴?/li>
運(yùn)行期上下文 : 當(dāng)函數(shù)執(zhí)行時(shí)掘譬,會(huì)創(chuàng)建一個(gè)稱為執(zhí)行期上下文的內(nèi)部對(duì)象泰演。一個(gè)執(zhí)行期上下文定義了一個(gè)函數(shù)執(zhí)行時(shí)的環(huán)境,函數(shù)每次執(zhí)行時(shí)對(duì)應(yīng)的執(zhí)行上下文都是獨(dú)一無(wú)二的葱轩,所以多次調(diào)用一個(gè)函數(shù)會(huì)導(dǎo)致創(chuàng)建多個(gè)執(zhí)行期上下文睦焕,當(dāng)函數(shù)執(zhí)行完畢藐握,它所產(chǎn)生的執(zhí)行上下文被銷毀
查找變量 : 從作用域鏈的頂端依次向下查找
function a() {
function b(){
var b = 234;
}
var a = 123;
b();
}
var glob = 100;
a();
首先我們來(lái)看上面的函數(shù),這個(gè)是個(gè)整體的函數(shù),a在這個(gè)全局的作用域里面,然后下面有g(shù)lob這個(gè)變量,然后有這個(gè)a執(zhí)行;
第一步 : 首先系統(tǒng)看到的肯定是這個(gè)a定義,a定義的話有這個(gè)[[scope]]。
scope指向scope chain
scope chain
scope指向這里
0 這個(gè)位置的0指向GO
GO
Global Object
0指向的是這個(gè)表
this
window
window
(object)
document
(object)
a
(function)
glob
100
[[scope]]里面有這個(gè)全局的執(zhí)行期上下文,然后a被執(zhí)行了,a被執(zhí)行垃喊,a產(chǎn)生的這個(gè)AO猾普,把自己的AO存到作用域鏈的最頂端,形成一個(gè)新的作用域鏈本谜,現(xiàn)在的a的[[scope]]和剛才的那個(gè)[[scope]]不一樣了
scope指向scope chain
scope chain
scope指向這里
0 這個(gè)位置的0指向AO
AO
1 這個(gè)位置的0指向GO
GO
Activation Object
0指向的是這個(gè)表
this
window
arguents
[]
a
123
b
(function)
Global Object
1指向的是這個(gè)表
this
window
window
(object)
document
(object)
a
(function)
glob
100
它的不一樣只是里面存的值不一樣了[[scope]]還是那個(gè)[[scope]],這個(gè)時(shí)候我們不看下面初家,這個(gè)時(shí)候假如我們?cè)L問(wèn)一個(gè)變量的話,我們?cè)L問(wèn)的是a的[[scope]]乌助,是從a的[[scope]]里面拿東西溜在,a的scope是一個(gè)倉(cāng)庫(kù),這個(gè)庫(kù)里面存了個(gè)作用域鏈,里面掛了各種變量,我去里面拿東西的時(shí)候他托,就置頂向下去找掖肋。
然后a的執(zhí)行,產(chǎn)生了b被定義赏参,a執(zhí)行了b才能被定義志笼,b被定義的時(shí)候有個(gè)天生的[[scope]],[[scope]]里面存了一個(gè)它所應(yīng)該有的作用域鏈把篓,但是它有的作用域鏈和a的不一樣纫溃,a被定義的時(shí)候,是在全局里面纸俭,所能返訪問(wèn)的屬性也只有它自己的AO還有全局的GO皇耗,但是b是在a函數(shù)里面定義的,所以b的[[scope]]不僅可以訪問(wèn)自己的AO揍很,也可以訪問(wèn)到a的AO郎楼,還有全局的GO
scope指向scope chain
scope chain
scope指向這里
0 這個(gè)位置的0指向自己的AO
0自己的AO
1 這個(gè)位置的1指向的a的AO
1指向的a的AO
2 這個(gè)位置的0指向GO
0指向GO
Activation Object
0指向的是這個(gè)表
this
window
arguents
[]
b
234;
Activation Object
1指向的是這個(gè)表
this
window
arguents
[]
a
123
b
(function)
Global Object
1指向的是這個(gè)表
this
window
window
(object)
document
(object)
a
(function)
glob
100
作用域銷毀
當(dāng)b執(zhí)行完之后,銷毀自己的ao,回到定義狀態(tài),等待下次被執(zhí)行
因?yàn)閎是函數(shù)a的最后一句,所以當(dāng)b執(zhí)行完之后,a也銷毀掉這么連帶著b的[[scope]]也被銷毀,回到定義狀態(tài),等待下次被執(zhí)行
//例子
function a() {
function b() {
function c(){
}
c();
}
b();
}
a();
a defined a.[[scope]] --> 0:GO
a doing a.[[scope]] --> 0:a的AO
1:GO
b defined b.[[scope]] --> 0:a的AO
1:GO
b doing b.[[scope]] --> 0:自己的AO
1:a的AO
2:GO
c defined c.[[scope]] --> 0:a的AO
1:c的AO
2:GO
c doing c.[[scope]] --> 0:自己的AO
1:b的AO
2:a的AO
3:GO
所以外部函數(shù)訪問(wèn)不到內(nèi)部函數(shù)的屬性和值
最后編輯于 :2019.03.11 23:44:25
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者