js解析器的執行原理

2022-06-06 13:51:13 字數 1697 閱讀 7256

alert(a);

var a = 1;

function a()

alert(a);

var a = 3;

alert(a);

function a()

alert(a);

上面**的執行順序是從上往下,當**執行到script標籤時,開始執行js**。

執行js**一般分兩步:1.預解析**。   2.逐行執行**。

第一步:預解析**

預解析**,主要會把var , function , 引數等一些東西儲存進倉庫裡面(記憶體)。

1.var 一般用於宣告變數,預解析**時,等號後面的賦值過程不會執行,所以預解析時的var 變數 都是未定義的。

2,.function 函式,預解析時,值就是函式裡面的內容。

當變數和函式重名時:就只留下函式的值,不管順序誰前誰後。所以函式的優先順序比變數高(注意:這只是預解析)。

當函式和函式重名時:會留下後面那個,會遵循上下文機制。

第二步:逐行執行**

當預解析完成後,開始逐行執行**,全部**都會完整的執行。

// alert 彈出何值?

alert(a);

var a=1;

function a()

alert(a);

var a=3;

alert(a);

function a()

alert(a);

第一步:預解析

上面說過,預解析時只會把var , function ,引數等儲存起來,所以:

執行到第二行時,a 的值是未定義。

執行到第四行時,a 的值是函式本身,也就是function a()。

執行到第六行時,a 的值還是第四行時的值,也就是function a(),因為函式的優先順序比變數高。

執行到第八行時,a 的值就變成了function a() ,因為當兩個函式重名時,遵循**從上往下執行。

第二步:**逐行執行

預解析完成之後,就是**逐行執行了,

第二行:會彈出function a() ,因為預解析完成之後,被存進記憶體的a 的值就是function a()

第三行:第三行裡有表示式,a 被賦了乙個新的值1  表示式會改變變數的值。表示式可以改變預解析的值。

第四行:只是函式的宣告,並沒有用到表示式,而且也沒有函式的呼叫,所以不會改變a 的值。

第五行:因為a 的值沒有變化,所以還是1

第六行:使用了表示式,a 被賦了乙個新的值3

第七行:會彈出3

第八行:函式的宣告,不會改變a 的值。

第九行:a的值沒有改變,所以還是3

// 輸入

alert(a); // 彈出function a()

var a=1;

function a()

alert(a); // 彈出1

var a=3;

alert(a); // 彈出3

function a()

alert(a); // 彈出3

閉包的定義:函式內部形成的私有作用域保護了內部變數,使得外部無法改變內部變數,內部變數也無法改變外部的同名變數,這種機制叫做閉包

js解析器的執行原理

首先看一段 我是span 的執行順序是從上往下的,當 執行到script標籤時,也就開始執行js 了。執行js 一般分兩步 1.預解析 2.逐行執行 預解析 呢,主要會把var function 引數等一些東西 儲存進倉庫裡面 記憶體 1.var 一般用於宣告變數,預解析 的時候,等號後面的賦值過程...

JS解析器的預解析機制

預解析 函式要先定義後呼叫不是指 書寫順序 舉個栗子 函式的兩種字面量的定義方式 1 console.log add 1 console在前 function add no1,no2 function add no1,no2 函式宣告不加 console.log add 1 console語句在後結...

使用解析器

使用解析器 使用解析器是非常簡單,可以使用它自己的詞法分析器,但是,用fsyacc.exe 產生的解析器總是要求詞法分析器。在這一小節,我們將討論如何使用自己的詞法分析器,以及與解析器聯合。警告記住f 編譯器不能直接使用.fsl 和 fsy 檔案,需要用fslex.exe 和 fsyacc.exe ...