首先看一段**
我是span
**的執行順序是從上往下的,當**執行到script標籤時,也就開始執行js**了。
執行js**一般分兩步:1.預解析**。 2.逐行執行**。
預解析**呢,主要會把var , function , 引數等一些東西 儲存進倉庫裡面(記憶體)。
1.var 一般用於宣告變數,預解析**的時候,等號後面的賦值過程不會執行,所以預解析時的var 變數 都是未定義的。
2,.function 函式呢,預解析的時候,值就是函式裡面的內容。
當變數和函式重名時:就只留下函式的值,不管順序誰前誰後。所以函式的優先順序比變數高。注意:這只是預解析。
當函式和函式重名時:會留下後面那個,會遵循上下文機制。
當預解析完成之後,就開始逐行執行**了,全部**都會完整的執行。
例項:下面的alert分別會彈出什麼值
第一步:預解析
上面說過,預解析時只會把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
最後結果為:
js解析器的執行原理
alert a var a 1 function a alert a var a 3 alert a function a alert a 上面 的執行順序是從上往下,當 執行到script標籤時,開始執行js 執行js 一般分兩步 1.預解析 2.逐行執行 第一步 預解析 預解析 主要會把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 ...