作用域、执行环境、作用域链
作用域,之前有介紹過,JavaScript無塊級作用域,只有函數(shù)作用域,簡單點(diǎn)說就是JavaScript的作用域就是函數(shù)作用域。因?yàn)橛泻瘮?shù)作用域,所以我們有全局作用域和局部作用域的說法。
執(zhí)行環(huán)境是什么?執(zhí)行環(huán)境定義了變量或函數(shù)有權(quán)訪問的其他數(shù)據(jù),每個(gè)執(zhí)行環(huán)境都有一個(gè)與之關(guān)聯(lián)的虛擬的變量對象,環(huán)境中定義的所有變量和函數(shù)都保存在這個(gè)對象中。
簡單說就是每一個(gè)函數(shù)就有一個(gè)執(zhí)行環(huán)境,函數(shù)里面的變量和函數(shù)都要通過這個(gè)函數(shù)去訪問。對于外部環(huán)境來說,每一個(gè)函數(shù)也是一個(gè)變量對象。每一個(gè)函數(shù)都有一個(gè)初始化的argument變量。
JavaScript中最大的全局執(zhí)行環(huán)境是window,執(zhí)行環(huán)境要在所有代碼執(zhí)行完畢才會被銷毀,而全局執(zhí)行環(huán)境window只有關(guān)閉網(wǎng)頁或者關(guān)閉瀏覽器才被銷毀。
當(dāng)代碼在一個(gè)環(huán)境中執(zhí)行時(shí),會創(chuàng)建變量對象的一個(gè)作用域鏈。作用域鏈的用途,是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。
講的有點(diǎn)抽象了,通過代碼或許更直觀:
<script>var a = 5;function fun1() {console.log(arguments)} </script> 復(fù)制代碼全局作用域window,局部作用域fun1,;全局執(zhí)行環(huán)境window,局部執(zhí)行環(huán)境fun1;window有自己的變量對象,就是window本身,window可以通過這個(gè)變量對象去訪問變量a和變量對象fun1。
當(dāng)fun1執(zhí)行的時(shí)候創(chuàng)建了一個(gè)作用域鏈,所以fun1有兩個(gè)變量對象,一個(gè)是自己,一個(gè)是全局環(huán)境的變量對象window。fun1可以在函數(shù)內(nèi)部訪問變量a,因?yàn)閒un1所在的作用域鏈可以找到變量a。
再比如:
var a = 5; function fun1() {var b = 6;function fun2() {var c = 7;} } 復(fù)制代碼這段代碼有三個(gè)執(zhí)行環(huán)境:全局環(huán)境window、局部環(huán)境fun1、局部環(huán)境fun2;
全局環(huán)境Window有一個(gè)變量a和一個(gè)函數(shù)fun1;
局部環(huán)境fun1有一個(gè)變量b和一個(gè)函數(shù)fun2,但是fun1可以訪問全局環(huán)境的變量a;
局部環(huán)境fun2有一個(gè)變量c,但是fun2可以訪問fun1環(huán)境中的變量b和全局環(huán)境的變量a;
這就是作用域鏈,作用域鏈中的內(nèi)部環(huán)境可以通過作用域鏈訪問所有的外部環(huán)境,但外部環(huán)境不能訪問內(nèi)部環(huán)境中的任何變量和函數(shù)。作用域鏈中,每一個(gè)局部環(huán)境都會首先尋找自身環(huán)境中的屬性和方法,搜索到了就停止尋找,沒有找到再向上搜索直到最外層window還搜索不到就報(bào)錯(cuò)。
歡迎關(guān)注Coding個(gè)人筆記 公眾號
轉(zhuǎn)載于:https://juejin.im/post/5c501f72e51d4551e653dac4
總結(jié)
以上是生活随笔為你收集整理的作用域、执行环境、作用域链的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: keepalived vrrp协议
- 下一篇: 如何安装zabbix_get