javascript
javascript系列之执行上下文
????? 寫在前面:一 直想系統的總結一下學過的javascript知識,喜歡這門語言也熱愛這門語言。未來想從事前端方面的工作,提前把自己的知識梳理一下。前面寫了些 DOM的知識,略覺水平有限。沒幾個月就要開赴找工作的前線,奈何自己還是個菜鳥,具體寫的時候還沒有一個完整的思路。多番考慮之后,決定還是翻譯外國的 經典系列文章,總結提升的同時,英語水平也可以上一個臺階,雙管齊下,相信對以后肯定有好處。當然這個系列的文章已經有好多人翻譯過了,水平都挺高(我翻 譯過之后參考了一些語句,在此感謝前輩)。要是你覺得我的很爛,還望輕拍磚。實在看不下去的,請繞行,重了會傷害我幼小的心靈的哦。
在此貼上本系列的英文地址:http://dmitrysoshnikov.com/tag/ecma-262-3/
?
| 引言 | 
???? 本文將會談到ECMAScript的執行上下文(譯者注:或者執行環境)和與此相關的各類型的可執行代碼
???? 每當控制器跳轉到ECMAScript的執行代碼中時,控制器也就進入了一個執行上下文。
???? 執行上下文(EC):ECMA-262用來定義一段可執行代碼的典型性和差異性的抽象概念。
???? 標準文檔沒有從技術實現的角度準確定義EC的結構和類型。這應該是ECMAScript引擎在具體實現時考慮的問題。
???? 邏輯上,一個動態執行上下文的集合形成了一個堆棧,棧的底部一般是全局執行上下文,頂部--當前(活動)執行上下文。通過壓入(push)和推出(pop)各種執行上下文來修改這個棧.
| 可執行代碼 | 
???? 可執行代碼是一個與執行上下文這個抽象概念相聯系的概念,在談到可執行代碼的同時,可能也就意味著一個執行上下文。
???? 例如,我們定義一個執行上下文堆棧為一個數組 ECStack=[] 每當進入一個函數(即使是遞歸調用的函數或者是構造函數),這個堆棧就壓入一個新的執行上下文,嵌入的eval函數也是一樣的。
| 全局代碼 | 
???? 這種代碼在“程序層面”中執行:例如外部加載的js文件或者是本地內聯代碼(在<script></script>標簽里)。全局代碼不包含存在于函數體內的任何代碼。初始化時(程序開始),ECStack如下:
1 ECStack=[globalContext];?
| 函數代碼段 | 
???? 當進入函數體(所有的函數),ECStack堆棧中壓入了新的元素。必須要注意的是具體函數代碼不包含它的內部函數代碼段。例如,我們調用一個遞歸調用自身的函數:
1 (function foo(flag){ 2 if(flag){ 3 return; 4 } 5 foo(true); 6 })(false)然后,ECStack堆棧修正如下:
1 //首先執行外部foo函數時 2 ECStack=[ 3 <foo>functionContext 4 globalContext] 5 //遞歸執行內部foo函數時 6 ECStack=[ 7 <foo>functionContext-遞歸foo 8 <foo>functionContext 9 globalContext]???? 當存在于當前執行上下文的函數返回時,ECStack彈出相應的執行上下文,這樣連續的自上而下的執行,棧指針也不斷移動,這是一個典型的堆棧實現方式。當相關段代碼執行完以后,ECStack只包括全局上下文(global context),直到整個應用程序結束。一個被拋出但是沒有被截獲的異常,同樣存在一個或多個執行上下文。
| eval代碼 | 
????? (譯者注:大量資深學者提出盡量不使用eval,而且此部分價值不大。減少閱讀量,故不翻譯)
???? 這一小部分理論在未來進一步分析與執行上下文相關的一些細節問題,比如變量對象,作用域鏈時是很需要的。這些理論將在相關章節中提到。
轉載于:https://www.cnblogs.com/mingwaer/p/3715678.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的javascript系列之执行上下文的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: Linux实战教学笔记02:计算机系统硬
 - 下一篇: linux 安装 Django14