標籤:
瀏覽器:“JS解析器”1)JS 的預解析,“找3樣東西,變數,函數,參數”:var function 參數a = undefined所有的變數,在正式運行代碼之前,都提前賦了一個值:undefined未定義fn1 = function fn1(){ alert(2); }所有的函數,在正式運行代碼之前,都是整個函數塊遇到重名的:只留一個變數和函數重名了,就只留下函數2)逐行解讀代碼:運算式:= + - * / % ++ -- ! 參數……什麼是運算式? 答:可以修改預解析的值!
總結:域由兩部分組成,script域和function域,先預解析後逐步執行代碼.預解析:找var和function!
兩大特徵: 自上而下,自內而外; 運算式能夠改變倉庫中的值;
0.
<script> alert(a); //undefined var a = 10;</script>//**********************//瀏覽器沒反應,F12顯示 "a is not defined"<script> alert(a); a = 10;</script>
0.1
<script> alert(a); // function a(){} var a = 1; alert(a); //1 function a(){ alert(4) } alert(a) //1</script>
0.2 執行到第一行代碼的時候先執行的js預解析,發現有var a變數的和函數 a,因為重名只能留一個,函數優先順序別高於變數和參數,所以是留下的是函數a,再往下解析凡是遇到變數直接ko掉直到遇到最後一個函數,後面的函數會覆蓋前面的函數!所以第一行 列印的是function a(){alert (4)}; 預解析好之後是逐步執行代碼,有加減乘除等就能改變預解析的值,所以a在不斷的被改變!本題中的函數都沒有被調用,可以被忽視,如果調用了那麼函數有自己的範圍,也要重新做預解析和逐步執行代碼
<script> alert(a) // function a(){alert 4} var a = 1; alert(a) //1 function a(){ alert(2) } alert(a) //1 var a = 3; alert(a) //3 function a(){ alert(4) } alert(a);//3 a(); //等價於3(),報錯是"a is not a function"</script>
1.
var a = 1; function fn1(){ alert(a); //1 }
2.
var a = 1; function fn1(){ alert(a); //undefined var a = 2; }
3.
var a = 1; function fn1(){ alert(a); var a = 2; } fn1();//undefined alert(a);//1
4. 當在fn1域中,找不到var和新的函數,那麼就會往它的父級範圍去找,找到了,彈出1;當遇到運算式a=2,更改了a的值!
<script> var a = 1; function fn1(){ alert(a); a = 2; } fn1(); //1 自內而外 alert(a); //2,局部修改全域</script>
5. 注意 函數的形參等於局部變數
<script> var a = 1; function fn1(a){ //等於var a alert(a); a = 2; } fn1(); //undefined alert(a); //1</script>
6.當遇到函數的調用的時候,形參a讀到是全域變數var a =1; 傳過去的時候變成了函數的局部變數,a = 2;改變的是函數範圍的局部變數a,與全部變數的a沒一分錢的關係
<script> var a = 1; function fn1(a){ alert(a); a = 2; } fn1(a); //1 alert(a); //1</script>
JS範圍解析