JS预解析
JS预解析过程是由浏览器中的Javascript解析器执行
解析步骤:
1、首先查找代码中的var
和 function
2、如果遇到var关键字,则先为变量赋值为undefined,而不是执行表达式中的赋值操作,赋值操作在后面的代码解析中执行
2、如果解析到函数的定义,则解析为函数
3、然后逐行解析代码,执行代码中的表达式(比如赋值,计算,类型转换等)或者函数调用
实例分析
alert(a); //弹出undefined
var a = 1;
function b(){
alert(a) //弹出1
}
1、首先查找到变量a、和函数b
2、为变量a赋值为undefined,
3、开始逐行解析代码
4、在执行alert(a); 时,此时a的值还是undefined,因此弹出的提示为:undefined
5、接着执行 var a=1; ,此时变量a的值为1
6、再执行b,弹出提示框,内容为变量a的值,此时变量a已被赋值为1,因此弹出的内容为1
预解析过程中所遇到的一些特殊情况
1、当函数与变量重名时,会被预解析为函数
2、当函数名相同时,最后被预解析的函数会覆盖上一个同名函数
3、遇到表达式(赋值、计算、类型转换等),变量值和类型都会被覆盖,即表达式可以修改预解析的值
实例分析
alert(a); //弹出函数a,同名函数解析为最后定义的函数
var a = 1; //变量a赋值为1
alert(a); //弹出1
function a() {
alert(2); //不执行,被下面定义的同名函数所覆盖
}
var a = 2; //变量a赋值为2
alert(a); //弹出2
function a() {
alert(3); //不执行,这里执行定义,没有执行
}
a();
//报错了,因为var a=2;已经在把预解析中的函数a改变为数据类型为整型的变量a,因此a()被解析为 2();,在解析器中不通过
作用域的预解析机制
全局作用域是指定义
var a =
1;
function
fn1() {
alert(a);
var a=2;
}
fn1();
alert(a);
var a =
1;
function
fn1() {
alert(a);
a=2;
}
fn1();
alert(a);
var a =
1;
function
fn1(a) {
alert(a);
a=2;
}
fn1();
alert(a);
var a =
1;
function
fn1(a) {
alert(a); //1
a=2;
}
fn1();
alert(a);
//
function
fn1() {
var a=1;
}
function
fn2() {
alert(a);
}
for循环的作用域
html:
javascript:
var btns
= document.getElementsByTagName(‘input’);
for(var i=0; i
alert(i) // i等于3
}
}
html:
javascript:
var btns
= document.getElementsByTagName(‘input’);
for(var i=0; i
alert(i)
// i等于undefined
for(var i=0; i
}
}
}