”JS解析器“需知道的两大步工作:
(1)找一些东西:var function 参数
a=未定义
所有的变量,在正式运行代码之前,都提前赋了一个值:未定义;
fn1=function fn1(){alert(2);}
所有的函数,在正式运行代码之前,都是整个函数块。
注:遇到重名的:只留一个(变量和函数重名,只留下函数;函数和函数重名,留下后来的一个)
(2)逐行解读代码:
表达式: = + - * / % ++ – ! 参数
注:表达式可以修改预解析的值
例题:
<script>
alert(a); //结果为function a(){alert(5);}
var a=1;
alert(a); //1
function a(){alert(3);} //不执行
alert(a); //1
var a=3;
alert(a); //3
function a(){alert(5);} //不执行
alert(a); //3
a(); //如果此时调用函数,就会报错,因为此时a的类型是number
</script>
JS解析过程:
(1)找:
a=未定义;(第一步找到一个变量)
function a(){alert(3);}(第二步找到一个函数,此时就会只存这个函数,变量就不在这里了)
var a=3;(变量和函数存在时,留函数,所以此时还是上面那个函数)
function a(){alert(5);}(顺序,存后来的函数)
经过上述一系列的变化,最终库里只剩下了 function a(){alert(5)};
(2)解读代码:
遇到表达式的时候会更改a 的值。
函数的作用域
(一)
var a=1;
function fn1(){
alert(a); //未定义
var a=2;
}
fn1();
alert(a); //1
(1)预解析:a=未定义;
function fn1(){
alert(a);
var a=2;
}
(2)逐行解读代码:
表达式
函数:(调用函数的时候首先去找函数内的各个值)
1)找一些东西:var function 参数 (此时会找到var a)
a=未定义
2)逐行解读代码:表达式
(二)
var a=1;
function fn1(){
alert(a); //1
a=2;
}
fn1();
alert(a); //2
若上述代码去掉var:
运行到a=2时,就会改变全局的变量a=1的值。
(1)预解析:a=未定义;
function fn1(){
alert(a);
var a=2;
}
(2)逐行解读代码:
表达式
函数:(调用函数的时候首先去找函数内的各个值)
1)找一些东西:var function 参数 (此时未找到a)
a=未定义
2)逐行解读代码:表达式
(三)
var a=1;
function fn1(a){
alert(a); //1
a=2;
}
fn1();
alert(a); //2
若加入参数a,
(1)预解析:a=未定义;
function fn1(a){
alert(a);
var a=2;
}
(2)逐行解读代码:
表达式
函数:(调用函数的时候首先去找函数内的各个值)
1)找一些东西:var function 参数 (此时会找到参数a)
a=未定义
2)逐行解读代码:表达式