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