浏览器: “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>