在ES6之前,javascript只有全局作用域和函數(shù)作用域。所謂作用域就是一個(gè)變量定義并能夠被訪問(wèn)到的范圍。也就是說(shuō)如果一個(gè)變量定義在全局(window)上,那么在任何地方都能訪問(wèn)到這個(gè)變量,如果這個(gè)變量定義在函數(shù)內(nèi)部,那么就只能在函數(shù)內(nèi)部訪問(wèn)到這個(gè)變量。
臨清ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!全局作用域只要頁(yè)面沒(méi)關(guān)閉就會(huì)一直存在,而函數(shù)作用域只有在函數(shù)執(zhí)行的時(shí)候才存在,執(zhí)行完就銷毀。且每次執(zhí)行函數(shù)都會(huì)創(chuàng)建一個(gè)新的作用域。
那么什么是作用域鏈呢?
在了解作用域鏈之前,我們先了解一個(gè)執(zhí)行期上下文的概念。
執(zhí)行期上下文:當(dāng)函數(shù)執(zhí)行時(shí),會(huì)創(chuàng)建一個(gè)稱為執(zhí)行期上下文的內(nèi)部對(duì)象(即AO或GO),一個(gè)執(zhí)行期上下文定義了一個(gè)函數(shù)的執(zhí)行環(huán)境,函數(shù)每次執(zhí)行時(shí)對(duì)應(yīng)的執(zhí)行期上下文都是獨(dú)一無(wú)二的,所以每次調(diào)用一個(gè)函數(shù)都會(huì)創(chuàng)建一個(gè)新的執(zhí)行期上下文,當(dāng)函數(shù)執(zhí)行完畢,所產(chǎn)生的執(zhí)行期上下文被銷毀。
作用域鏈就是函數(shù)中[[scope]]屬性所存儲(chǔ)的執(zhí)行期上下文對(duì)象的集合,這個(gè)集合呈鏈?zhǔn)芥溄樱覀儼堰@種鏈?zhǔn)芥溄咏凶鲎饔糜蜴湣?/p>
作用域鏈更像是一種包含的關(guān)系。比如說(shuō)函數(shù)A內(nèi)部定義了一個(gè)函數(shù)B,所以B的定義是依賴于A的,也就是說(shuō)B在A的內(nèi)部,那么B中就可以訪問(wèn)A的中的變量和方法。這種一層一層向上依賴的關(guān)系就構(gòu)成了作用域鏈。
為了更好理解,我們直接看例子。
var name = 'xiaoyu'; function fn1() {}; function fn2() { var num = 10; function fn3() { var num1 = 10; console.log(num); }; return fn3; } var fn4 = fn2();