JavaScript執行環境

執行環境也叫執行上下文(execution context) 是JavaScript中一個基礎又很重要的概念。它是定義了變量或函數有權訪問的其餘數據,決定了他們各自的行爲。每一個執行環境都會建立一個與之相關聯的變量對象(存放執行環境定義的全部變量和函數,詳細請跳轉:JavaScript變量對象),創建一個做用域鏈,以及肯定this的指向。javascript

當控制器執行到可執行代碼時,就會進入一個執行環境,執行環境分爲三種:html

  • 全局環境 JavaScript代碼執行起來首先會進入全局環境
  • 局部環境(函數環境)當函數被調用時,就會進入當前函數環境執行代碼,把當前環境推入棧內存中的頂端
  • eval

在一個JavaScript程序中會有多個執行環境被建立,JavaScript引擎利用堆棧來處理他們,這個堆棧叫作函數調用棧(call stack)。棧底永遠都是全局環境,而棧的頂端則是當前執行環境。當前環境執行完畢後,會被彈出棧,接着進入下一個執行環境,直到進入全局環境,這時只有結束整個JavaScript程序也就是關閉當前網頁或者關閉瀏覽器,全局環境纔會被彈出被銷燬。java

示例代碼

 

var num = 0;
function test(){
    function foo(){
    console.log("foo");
  }
  foo(); }
test();

首先進入全局環境,執行到可執行代碼test()時,test()的執行環境被建立而且進入棧中。進到test環境後,代碼繼續執行遇到可執行代碼foo()時,foo()的執行環境也被建立,foo()的執行環境進入棧。在foo()中,控制器沒有遇到能夠生成其餘的執行環境了,因而順利執行完畢,foo()執行環境被彈出棧。當前的環境就來到test(),test裏的代碼往下走也沒有其餘環境生產順利執行完畢,彈出棧,就這樣堆棧內存中就只剩全局環境了,只有當咱們關閉網頁或瀏覽器時,全局環境纔出棧。(PS:函數中,遇到return能直接終止可執行代碼的執行,所以會直接將當前上下文彈出棧。)瀏覽器

整個過程以下圖:函數

從上面的分析咱們能夠總結執行環境有以下特色:post

  • 單線程
  • 同步執行,只有棧頂的環境執行完畢出棧後,後面的環境才能夠執行其代碼。
  • 全局環境只有一個且永遠在棧底,只有關閉網頁或瀏覽器纔會出棧。
  • 函數環境能夠有無數個
  • 每次函數被調用都會建立其執行環境,即便調用自身,也會建立一個新的執行環境

 

執行環境的生命週期this

在以前的變量對象隨筆上也提到過執行環境的生命週期,分別是建立階段和執行階段url

參考連接:http://mp.weixin.qq.com/s?__biz=MzI0NjU1NDE5Ng==&mid=2247484017&idx=1&sn=a53ddb77a8af6b18a83ef1c505fe2f80&chksm=e9bcc94adecb405c55390790b0e4c507e481d7701b4773c906cae14884022846d0e90fb03fb1&scene=0#rdspa

相關文章
相關標籤/搜索