浏览器有读js的解析器,从script标签开始解析:
- 第1步--预解析,找到全局的var和function,var的变量的值设置undefind ,function函数名和内容会整体保存为字符串,变量名和函数名重名时保留函数(既有内容的),函数和函数重名时后面的字符串覆盖前面的字符串
- 第2步--逐行读代码,变量在赋值之前一直是undefind,除非读到=、+、-、*、/、%、++、--、!等表达式,而逐行读到函数时则什么都不会做,直到函数被调用才会执行其内容代码
例1.第一步:预解析:把undefined赋给var,解析function;第二步:逐行读代码:到调用函数时,遇到私有的var,开始预解析;
var a=1;
function fn1(){
alert(a);//undefined
var a=2;
}
fn1();
alert(a);//1
例2.
var a=1;
function fn1(){
alert(a);//1
a=2;
}
fn1();
alert(a);//2
例3.
var a=1; //参数就是局部变量a-->var a
function fn1(a){
alert(a);//undefined
a=2;
}
fn1();
alert(a);//2
例4.作用域链:在一个域内没有找到某变量时,会由里到外,自上到下去更高级的域中去寻找,再改一下后分析:
var a=1;
function fn1(){
alert(a);//1
a=2;
}
fn1(a);
alert(a);//2
例5.函数内的var定义一个局部变量,没有办法从外面找到函数里面的东西,如:
function fn1(){var a = 'abc';} //在全局里a找不到
如果想要获取函数里的内容的可以用全局变量储存:
var str = '';
function fn1(){
var a = 'abc';
str = a;
}
fn1();
alert(str);
还可以使用局部函数调用的方法:
function fn1(){
var a = 'abc';
fn2(a);
}
function fn2(str){
alert(str);
}
例6.f2被包在函数f1内部,f1内的所有局部变量对f2都是可见的,f2内的局部变量对f1就是不可见了
function f1(){
var n=999;
function f2(){
alert(n);
}
f2();// 999
}
f1();
例7.既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗,如:
function f1(){
var n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999