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();

 

posted on 2017-12-26 14:24  执候  阅读(160)  评论(0编辑  收藏  举报