浏览器解读代码时,会按照以下顺序进行加载,先是对var 声明的变量进行预处理,只声明不复制,之后对于函数声明进行提升,并把函数的内容打印到函数名的后面,最后对于参数进行处理。
之后浏览器按照代码加载顺序,逐行解析代码,遇到表达式再开始赋值,同时修改仓库里面的值。
function a(b){
alert(b);
function b(){
alert(b); //此处弹出function b
};
b(); //此处弹出 function b
}
a(1);
var n=0;
function a(){
var n=10;
function b(){
n++;
alert(n);
}
b();
return b;
}
var c=a(); //此处执行了一遍a函数 -->11
c(); // -->12
alert(n) // -->0
alert(a);
var a=1;
alert(a);
function a(){
alert (2);
}
alert(a);
function a(){
alert(4)
}
alert(a);
不同script添加的js文件,可以建立向前方的依赖关系,但是之前的不能取到后方的内容。由此可以总结出,对于此种情况下的js作用域,是自上而下的,类似于函数中由内及外的作用域关系。
var a=1;
function fn1(){
alert (a);
var a=2;
}
fn1(); //函数内声明的a在作用域上优于父级函数的声明,但是由于只声明 未赋值,因此弹出undefine;
alert(a); //1
var a=1;
function fn1(a){
alert(a);
a=2;
}
fn1(); // undefine 此时a应该为传递进的参数
alert(a); //1
不论函数还是变量,都是有作用域的,而预解析只能是在同一作用域下提前解析。
作用域是看的函数声明或者变量所定义的位置,而不是调用它们的位置。
function fn1(){
var a='eva';
fn2();
}
function fn2(){
alert(a);
}
fn1(); // 报错 由于fn2所在的作用域中没有声明a
function fn1(){
var a='eva';
fn2(a);
}
function fn2(a){
alert(a)
}
fn1(); //弹出eva