作用域
通常代碼中變量和函數(shù)并不總是可用的,而限定他們可用范圍就被稱作為作用域浮梢。作用域被分為全局作用域和局部作用域兩種跛十。
- 全局作用域:即在全局當(dāng)中任何地方都可用的的作用域,屬于window下的作用域秕硝。
- 局部作用域:只能在函數(shù)內(nèi)部訪問的作用域芥映,變量和函數(shù)不能和外界共用。
作用域鏈
每當(dāng)聲明一個(gè)函數(shù)的時(shí)候會(huì)有一個(gè)獨(dú)立的的作用域远豺,遇到函數(shù)執(zhí)行需要調(diào)用某一個(gè)變量的時(shí)候奈偏,需要先在當(dāng)前函數(shù)的作用域下尋找。如果當(dāng)前函數(shù)的作用域下找不到該值變量躯护,就需要進(jìn)入到創(chuàng)建該函數(shù)所在的作用域下尋找惊来,以此往上直至找到為止。這樣就形成了一條作用域鏈棺滞。
舉個(gè)例子
例如上述代碼裁蚁,
在function fn1內(nèi)是一個(gè)獨(dú)立的作用域,在function fn2和function fn3中又是兩個(gè)獨(dú)立的作用域继准。當(dāng)輸出fn1的時(shí)候枉证,需要先找到fn1下返回fn3的值。對(duì)應(yīng)到fn3中需要找到fn2輸出的a移必。而在fn2的作用域中室谚,找不到變量a,需要返回到創(chuàng)建function fn2的作用域下尋找崔泵,即fn1的作用域中秒赤,得到var a = 2,因此代碼輸出結(jié)果為2管削。
需要遵循以下三條原則
- 函數(shù)在執(zhí)行的過程中倒脓,先從自己內(nèi)部找變量
- 如果找不到,再?gòu)膭?chuàng)建當(dāng)前函數(shù)所在的作用域去找, 以此往上
- 注意找的是變量的當(dāng)前的狀態(tài)