js執行過程
如果乙個文件中存在多個**段通過步驟二 js會先生成乙個語法分析樹(syntaxtree)步驟一:讀入第乙個**段(js引擎並非一行一行執行,而是一段一段分析執行)
步驟二:做詞法分析和語法分析,有錯則報語法錯誤(比如括號不匹配等),並跳轉到步驟5
步驟三:對【var】變數和【function】定義做「預解析「(永遠不會報錯的,因為只解析正確的宣告)
步驟四:執行**段 ,有錯則報錯(比如變數未定義)
步驟六:結束
語法分析樹可以理解為 記錄 變數集 作用域集 方法集的 資料庫一樣的東西。
/*** 模擬建立一棵語法分析樹,儲存function內的變數和方法
*/var sytaxtree = //
假設我們全域性變數中有乙個name
}, functions:
},sayname:
}}//在這一步的時候 變數集中 只有變數定義,沒有變數值,這時候的變數值全部為「undefined」
//
詞法作用域: 變數在定義的時候形成作用域,而不是在執行的時候。
在進入上下文時宣告,在執行上下文賦值
functiontest()
console.log(a);
//a is not defined
執行環境與活動物件
我們呼叫每乙個方法的時候,js 引擎都會自動為其建立乙個執行環境和乙個活動物件,它們和方法例項的生命週期保持一致,為方法執行提供必要的執行支援執行環境executioncontext: 記錄了當前方法的外部描述資訊,比如型別,名稱,引數和活動物件(activeobject)
var executioncontext =,a:};
在執行的時候才生成活動物件 ,活動物件的 北部變數集、內嵌函式集是從 語法分析樹 複製過來的活動物件activeobject: 記錄了當前方法的內部描述資訊,內部變數集(variables)、內嵌函式集(functions)、實參(arguments)、作用域鏈(scopechain)等執行所需資訊
var activeobject=,a:},
functions:,
parameters:,
arguments: //實參
} }
乙個方法的執行過程:
建立活動物件,從語法分析樹複製方法的內部變數集(variables)和內嵌函式集(functions)
方法開始執行時: 活動物件- 內部的變數全部被重置為undefined 。
建立形參(parameters)和實參(arguments)物件,同名的實參,形參和變數之間是【引用】關係
執行方法內的賦值語句 : 內部的變數才會被賦值 。
變數查詢規則: 現在當前的activeobject查詢,找不到 則順著 scopechain 指向的活動物件 繼續,直到找到最頂點 activeobject.window
方法執行完畢以後:內部變數不會被重置
方法內變數的生存週期取決於方法例項是否存在活動引用,如沒有就銷毀活動物件
6.7 是使閉包能夠訪問到外部變數的根本原因
cefsharp 執行環境與JS
cef其是封裝了google的chromium瀏覽器控制項,cefsharp其是對於cef的.net封裝,且是使用cli的方式封裝,那其就有三個專案 chromium,cef,cefsharp chromium cef cefsharp cefsharp其的基本類 c native層 1.libce...
js函式的執行環境
js的函式本質上是一種物件,是物件就會有自己的環境 作用域 看下面的例子 var var1 var var2 var2.getmessage 這段 會輸出 var2 不對啊,應該是輸出 var1 啊,但是這裡確實應該輸出 var2 不信你自己實驗。這就是函式體中的this在起作用,var2的函式ge...
HTML中 js執行環境切換
在父窗體中,要把執行環境切換到iframe內部,使用 new function,事件,event等都會無效,執行環境始終會在父視窗中。要切換環境需要把要執行的函式寫到iframe內部的script標籤 var doc iframe.contentwindow.document jscontent是要...