js解析与执行过程:预处理阶段和执行阶段
在预处理阶段,用var定义变量,用声明的方式创建函数
例一:
1 f(); 2 g(); 3 function f(){ 4 console.log("fff");//fff 5 } 6 var g=function(){ 7 console.log('gg');//g 不是一个function 8 }
1 console.log(a);//undefined 2 console.log(b);//b is not defined 3 var a=5; 4 b=6;
1 //先扫描声明后扫秒变量 2 //处理函数声明的时候有冲突就会覆盖, 3 //处理变量声明时有冲突,会忽略 4 alert(f);//function f(){console.log("22");} 5 var f=5; 6 function f(){ 7 console.log("11"); 8 } 9 var f=6; 10 11 function f(){ 12 console.log("22"); 13 }
执行阶段
1 alert(a)//undefined 2 //alert(b)//b is no defined 3 alert(f) //function f(){console.log(f);} 4 alert(g) //undefined 5 //上面都是预处理阶段 6 //下面是执行阶段 7 var a=5; 8 b=6; 9 alert(b);//6 10 function f(){ 11 console.log(f); 12 } 13 var g=function(){ 14 console.log("g"); 15 } 16 alert(g);//function(){console.log("g")}
函数预处理和执行阶段
1 function f(a,b){ 2 //a变成1,b变成2,变成指向函数的引用 3 alert(a); //function a(){} 4 alert(b); //2 5 var b=100; 6 function a(){ 7 8 } 9 } 10 f(1,2);
作用域:可以被访问的范围
1 alert(a);//undefined 2 alert(b);//undefined 3 alert(c);//报错 4 alert(d);//报错 5 var a=1; 6 if(false){//js不是块作用域 7 var b=2; 8 }else{ 9 c=3; 10 } 11 function f(){ 12 var d=4; 13 }
块作用域{ 这个区域 }
for(var i=0;i<3;i++){}
alert(i) //3 说明js没有块作用域
词法作用域(lexical)(静态作用域或闭包)
闭包的概念:闭包就是能够读取其他函数内部变量的函数
1 function f1(){ 2 var a=10; 3 var b=20; 4 //这就是一个闭包 5 function f2(){ 6 console.log(a); 7 } 8 f2(); 9 } 10 f1();
function f1(){
var a=10;
var b=20;
//这就是一个闭包
return function f2(){
console.log(a);//10
}
}
var result=f1();
result();