理解作用鏈旗笔;

理解作用鏈的作用

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ù)遍歷伞插,找不到就報錯。

舉例:


6.png

1 預(yù)處理后盾碗,進入全局上下文

7.png

2 執(zhí)行bar()函數(shù)

8.png

3 查找變量

9.png

4 執(zhí)行foo()函數(shù)

10.png

作者:彭榮輝
鏈接:http://www.reibang.com/u/0f804364a8a8
來源:簡書
著作權(quán)歸作者所有媚污。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處廷雅。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耗美,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子航缀,更是在濱河造成了極大的恐慌商架,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芥玉,死亡現(xiàn)場離奇詭異蛇摸,居然都是意外死亡,警方通過查閱死者的電腦和手機灿巧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門赶袄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來揽涮,“玉大人,你說我怎么就攤上這事饿肺〗В” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵敬辣,是天一觀的道長雪标。 經(jīng)常有香客問我,道長溉跃,這世上最難降的妖魔是什么村刨? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮喊积,結(jié)果婚禮上烹困,老公的妹妹穿的比我還像新娘。我一直安慰自己乾吻,他們只是感情好髓梅,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绎签,像睡著了一般枯饿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诡必,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天奢方,我揣著相機與錄音,去河邊找鬼爸舒。 笑死蟋字,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的扭勉。 我是一名探鬼主播鹊奖,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼涂炎!你這毒婦竟也來了忠聚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤唱捣,失蹤者是張志新(化名)和其女友劉穎两蟀,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體震缭,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡赂毯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欢瞪。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡活烙,死狀恐怖徐裸,靈堂內(nèi)的尸體忽然破棺而出遣鼓,到底是詐尸還是另有隱情,我是刑警寧澤重贺,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布骑祟,位于F島的核電站,受9級特大地震影響气笙,放射性物質(zhì)發(fā)生泄漏次企。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一潜圃、第九天 我趴在偏房一處隱蔽的房頂上張望缸棵。 院中可真熱鬧,春花似錦谭期、人聲如沸堵第。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽踏志。三九已至,卻和暖如春胀瞪,著一層夾襖步出監(jiān)牢的瞬間针余,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工凄诞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留圆雁,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓帆谍,卻偏偏與公主長得像伪朽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子既忆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容