正如我們了解的一樣,當我們書寫了js程式之後,開啟瀏覽器,我們的**就可以開始執行了(當然保證你的**沒有問題,才能按照你的預期進行執行)。剛才說的是js執行的乙個大的環境,今天我們學習一下,js在解析器裡的乙個執行過程。
這個過程分為兩個階段:
變數物件的變化,和這兩個階段息息相關。
在介紹這兩個階段之前,了解相關的概念。
如果變數和執行上下文相關,那麼它應該知道在**儲存資料和怎麼訪問資料,這種機制叫做變數物件(variable object,簡稱vo)。用於儲存下列資料:
第乙個階段:進入執行上下文。此時vo將會被下面的屬性初始化(按照下面的順序進行初始化):
vo的使用環境有:globalcontext和functioncontext。
來乙個例子:
function test(a, b)var e = function _e(){};
(function x(){});
}test(30);
當進入執行環境,vo如下:
vo (test functioncontext) =
注:其中x 、_e都是函式表示式,_e通過變數宣告e進行訪問。
以上面的例子來說,會經歷下面的過程:
vo['c'] = 20;vo['e'] = ;
這樣**就執行完了。
再來乙個經典的例子:
alert(x); //functionvar x = 10;
x = 20;
function x() {}
alert(x); //20
為什麼第乙個是function,而不是undeofined或者是not defined或者10、20?因為,根據規範 — 當進入上下文時,往vo裡填入函式宣告;在相同的階段,還有乙個變數宣告「x」,那麼正如我們在上乙個階段所說,變數宣告在順序上跟在函式宣告和形式引數宣告之後,而且,在這個階段,變數宣告不會干擾vo中已經存在的同名函式宣告或形式引數宣告,因此,在進入上下文時,vo的結構如下:
vo = {}vo['x'] = ;
vo['x'] =
在**執行階段:
v['x'] = 10;v['x'] = 20;
了解了這個過程,我相信對js執行過程會有乙個全新的理解。
留乙個小小的問題(猜想一下輸出結果):
function test(a, b)var e = function _e(){};
(function x(){});
}test(30);
js 非同步執行 js執行過程你了解多少?
js執行過程你了解多少?重慶崽兒brand的個人主頁 www.brandhuang.com js是單執行緒語言 在瀏覽器中只有乙個執行緒在執行js指令碼 雖然js是單執行緒,但在js執行過程中並不是只有乙個執行緒。其實有四個執行緒,包括 js引擎執行緒 事件觸發執行緒 定時器觸發執行緒 http非同...
scrapy的執行環境你了解嗎?
scrapy的執行環境你了解嗎?scrapy專案目錄以及各路徑檔案的用處 website scrapy.cfg test.py website bloomfilter bloomfilter.py connection.py defaults.py dupefilter.py picklecompa...
JS 基礎 你真的了解 console 嗎?
正文結語 相信大部分的人學習任何語言或是工具都是從hello world開始的,它代表的不僅僅是輸出字串的 demo,更是乙個以最基礎的實現最快了解工具執行原理的重要思想。不過這不是本篇要討論的 笑,本篇要討論的是 js 開發者中用得最多沒有之一的console。用過 js 都知道 console ...