理解作用鏈的作用
1.函數(shù)在執(zhí)行的過程中倒脓,先從自己內(nèi)部找變量
2.如果找不到罗心,再從創(chuàng)建當(dāng)前函數(shù)所在的作用域去找, 以此往上
3.注意找的是變量的當(dāng)前的狀態(tài)
范例
var a = 1
function fn1(){
function fn2(){
console.log(a)
}
function fn3(){
var a = 4
fn2()
}
var a = 2
return fn3
}
var fn = fn1()
fn() //2
最后執(zhí)行fn2函數(shù)里伯,fn2找不到變量a,接著往上在找到創(chuàng)建當(dāng)前fn2所在的作用域fn1中找到a=2;
var a = 1
function fn1(){
function fn3(){
var a = 4
fn2()
}
var a = 2
return fn3
}
function fn2(){
console.log(a)
}
var fn = fn1()
fn() //1
同上
var a = 1
function fn1(){
function fn3(){
function fn2(){
console.log(a)
}
fn2()
var a = 4
}
var a = 2
return fn3
}
var fn = fn1()
fn() //undefined
函數(shù)fn2在執(zhí)行的過程中,先從自己內(nèi)部找變量找不到渤闷,再從創(chuàng)建當(dāng)前函數(shù)所在的作用域fn去找,注意此時變量聲明前置疾瓮,a已聲明但未初始化為undefined;
理解作用鏈的原理:
前提:了解全局作用域,函數(shù)作用域飒箭,變量和函數(shù)的聲明前置等基礎(chǔ)狼电;
函數(shù)的生命周期
函數(shù)的的生命周期分為創(chuàng)建和執(zhí)行兩個階段。
- 在函數(shù)創(chuàng)建階段补憾,JS解析引擎進行預(yù)解析漫萄,會將函數(shù)聲明提前,同時將該函數(shù)放到全局作用域中或當(dāng)前函數(shù)的上一級函數(shù)的局部作用域中盈匾。
- 在函數(shù)執(zhí)行階段,JS引擎會將當(dāng)前函數(shù)的局部變量和內(nèi)部函數(shù)進行聲明提前毕骡,然后再執(zhí)行業(yè)務(wù)代碼削饵,當(dāng)函數(shù)執(zhí)行完退出時岩瘦,釋放該函數(shù)的執(zhí)行上下文,并注銷該函數(shù)的局部變量窿撬。
變量對象(Variable Object)
VO對應(yīng)的是函數(shù)創(chuàng)建階段启昧,JS解析引擎進行預(yù)解析時,所有的變量和函數(shù)的聲明劈伴,統(tǒng)稱為Variable Object密末。
該變量與執(zhí)行上下文相關(guān),知道自己的數(shù)據(jù)存儲在哪里跛璧,并且知道如何訪問严里。
VO是一個與執(zhí)行上下文相關(guān)的特殊對象,它存儲著在上下文中聲明的以下內(nèi)容:
- 變量 (var, 變量聲明);
- 函數(shù)聲明 (FunctionDeclaration, 縮寫為FD);
- 函數(shù)的形參
function add(a,b){
var sum = a + b;
function say(){
alert(sum);
}
return sum;
}
// sum,say,a,b 組合的對象就是VO
AO(活動對象)
- 對應(yīng)的是函數(shù)執(zhí)行階段追城,當(dāng)函數(shù)被調(diào)用執(zhí)行時刹碾,會建立一個執(zhí)行上下文,該執(zhí)行上下文包含了函數(shù)所需的所有變量座柱,該變量共同組成了一個新的對象就是Activetion Object迷帜。
該對象包含了:
- 函數(shù)的所有局部變量
- 函數(shù)的所有命名參數(shù)
- 函數(shù)的參數(shù)集合
- 函數(shù)的this指向
unction add(a,b){
var sum = a + b;
function say(){
alert(sum);
}
return sum;
}
add(4,5);
// 我用JS對象來表示AO
// AO = {
// this : window,
// arguments : [4,5],
// a : 4,
// b : 5,
// say : ,
// sum : undefined
// }
作用域鏈
1.當(dāng)代碼在一個環(huán)境中執(zhí)行時,會創(chuàng)建變量對象的一個作用域鏈(scope chain)來保證對執(zhí)行環(huán)境有權(quán)訪問的變量和函數(shù)的有序訪問色洞。
2.作用域第一個對象始終是當(dāng)前執(zhí)行代碼所在環(huán)境的變量對象(VO)戏锹,即在當(dāng)前執(zhí)行函數(shù)的作用域中尋找變量。
3.在函數(shù)運行過程中標(biāo)識符的解析是沿著作用域鏈一級一級搜索的過程火诸,從第一個對象開始锦针,逐級向后回溯,直到找到同名標(biāo)識符為止惭蹂,找到后不再繼續(xù)遍歷伞插,找不到就報錯。
舉例:
1 預(yù)處理后盾碗,進入全局上下文
2 執(zhí)行bar()函數(shù)
3 查找變量
4 執(zhí)行foo()函數(shù)
作者:彭榮輝
鏈接:http://www.reibang.com/u/0f804364a8a8
來源:簡書
著作權(quán)歸作者所有媚污。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處廷雅。