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 ...