JacaScript預解析

(1)什麼是js的預解析?
預解析就是js代碼在執行之前會在相應的執行環境中預先把一些東西解析到內存。
預解析一般都預先解析哪些東西?
預先解析 function 和 var
預解析的順序是什麼樣的?
1、首先是找到<script></script>標籤按照<script>塊依次解析
2、解析執行環境
3、對標識符(var function)進行解析
例如:
<script>
test();
function test(){
alert('This is test');
};
</script>
在瀏覽器中打印出來的是This is test
上面的案例中,在function test()之前就調用了test()函數照樣可以彈出 This is test 可見在js執行之前就預先把 function test()解析到了內存,所以調用test()照常彈出結果;然而當我們執行了 var test = "this is test";這就話是就完成了賦值,所以在次調用 alert 就彈出 this is test。

(2)變量和函數重名的時候會是什麼情況?
例如:
<script>
alret(test);
var test = "this is test";
function test(){
return "this is function";
};
alert(test);
</script>
上面的案例中,當函數名和變量名一樣的時候,alert(test);調用的是函數function test()的指針,而不是調用的變量 var test;所以function的預解析 優先級 高於 var 。

(3)"解析執行環境"是什麼意思?
<script>
function test(){
var msg = 'This is test';
};
alert(msg); //報錯msg未定義
</script>
上面的案例中,爲什麼會出現msg未定義呢!?預解析不是會在js執行的時候預先解析 function 和 var msg 嗎?我們在function裏面定義了 var msg,那麼爲什麼會報錯呢!?
原因:“解析環境” 在js執行之前是會預解析 function 和 var沒錯,但是在本例中他們“解析執行環境”不同。
function test 是在一個全局的環境中,而msg是function test 中定義的一個局部變量,msg的“解析執行環境”是在function test 這個函數裏面(這裏可以理解爲function test裏的局部環境),所以當我們在全局這個環境中 alert(msg) 的時候,並沒有定義msg這個變量或者函數,所以就報錯了。
<script>
alert(msg);
function test(){
alert(msg2);
var msg2 = 'This is test';
};
var msg = "123";
test();
</script>
經過修改後的實例中,會彈出兩個undefined,第一個是 alert(msg) 運行時彈出的結果,第二個是 alert(msg2) 運行時彈出的結果.
js在執行之前 預解析,解析全局的環境,解析到function test 和 var msg ;所以 alert(msg) ;會彈出undefined;
然後當程序執行到 test() ;的時候會進入 function test 裏面去,也就是進入 function test 的局部環境去 預解析 ,這時候解析到 var msg2 ,所以也彈出了undefined ;

(4)變量預解析:
<script>
alert(test);
var test = "this is test";
alert(test);
</script>
上面的案例中,首先彈出的是undefined,然後接着彈出的是 this is test,在 var test = 'this is test',之前就調用 alert 彈出 test ,而沒有報 test 未定義的錯誤,而是彈出了undefined,可見在js執行之前就預先把 var test的定義預先解析到內存裏了,但是並沒有給變量賦值。

本人菜鳥一枚,如有理解不當之處,歡迎各位留言指正。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章