day-8.5 函数作用域解析的练习

定义和执行都是对于作用域而言的,作用域是按层级划分的。

举个例子: 从例子可以看到全局作用域因为script标签而创造,接着全局作用域里面的子作用域通过函数去创建。

 1 <script>  //script标签创建了一个作用域1
 2     var a = 10 ;   //1、大的script的作用域里面,定义变量a;
 3     function b (){   //1、定义了函数b';
 4     var a = 30;   //2、在b的作用域里面定义了变量a
 5     alert (a);
 6         function b (){  //2、在b的作用域里面再定义了一个函数b;
 7             var b = 40;  //3、在小b执行的时候创建的作用域3里面再定义了一个变量b。
 8             alert(b);
 9 }
10         b();  //2、函数b执行,创造了个函数b的作用域3、
11 }
12     b();   //1、执行函数b的时候,创造了个b的作用域2,
13 <script>    

代码解析顺序:

所有代码在本作用域里面都是先定义后执行,执行的结果如果是单纯的变量赋值,那就赋值完就结束了。如果执行的结果如果是函数,则会创建一个新的作用域。

JS的代码解析顺序

定义过程:

会查找该层作用域所有var 声明的变量名和function 定义的函数名

var 和 function 在定义阶段只有变量名有意义,所有函数的结果都是无意义的,只有执行的时候才会去解析。

定义阶段 ,var 和var 同名,function 和function 同名,留后面的,var 和 function 同名 留 function 。

比如:

1 <script>
2     var a = 10;  //在定义阶段只读取这句代码的var a ,=号后面的赋值是执行阶段的工作;
3     function b (){  //在定义阶段值读取这句代码的 function b ,后面的所有关于b这个函数的具体内容,是执行阶段再读取。
4     //code 
5 }
6     function c(){  // 这个比较特殊,这种写法定义阶段应该是只读取了,function 后面的具体内容是代码执行阶段再去读取的。
7     //code 
8 };
9 </script>

function 定义的函数和var 定义的函数,在执行的时候是由区别的。

function 定义的函数,函数名可以放在定义的前面去执行。而var 定义的函数,如果函数名放在前面去执行的话会报错,因为var 定义的函数在定义阶段只是声明了 a 这个变量,而不像function 定义的函数在定义阶段直接就是声明a这个函数。

1 a(); //弹出2
2 function a () {
3 alert(2);
4 }
5 b(); //报错,因为这个时候b只是一个值为undefined的变量,而不是函数。所以报错。
6 var b = function () {
7 alert (3);
8 }

 

解析练习

练习1

1 <script>
2     alert (a);  //弹出undefined ,先定义var  a ,然后执行alert(a); a=10, alert(a);
3     var a = 10;  
4     alert(a); //弹出10;
5 </script>

练习2

1、全局作用域定义阶段

    var a  ;

    var b = function

    全局作用域执行阶段

    a = 5

    b();-----------创建函数b的子作用域

          2、子作用域定义阶段

              var a ;

                子作用域执行阶段

                alert(a);  //输出undefined

              a=10;

              

    alert(a) ;//输出全局作用域的 5,

最终输出结果是 undefined 5

下面练习推理方法一致,不再做推理。

1 var a = 5;  
2 b();
3 var b = function (){
4   alert (a);    //输出undefined
5   var a = 10;   
6 }
7 alert (a);     //输出5

 

练习3;

1 a ();
2 function b (){
3   alert  (x);    //undefined
4   var x = 10;  
5 }
6 alert(x);   //报错,x is no defind

 

练习4;

 1 alert(a);  //弹出alert(40)的函数体
 2 var a = 10; 
 3 alert(a);  //弹出10,
 4 function a (){ 
 5   alert(20);  
 6 }
 7 var a =30;
 8 alert(a);   //弹出30
 9 function a(){
10    alert(40); 
11 } 
12 alert(a);  //弹出30 
13 //代码中的函数都没有执行,没有子作用域,函数内的语句都未生效。

 

练习5;

1 var a = 10;
2 alert(a); //弹出10
3 a();  //a 此时已经变成了number数据类型,对num用括号执行,程序报错。
4 function a (){   
5   alert(2)  
6 }

 

练习6;

 1 a();   //function 和 var 同名时,留function ,所以这里输出2
 2 var a = function () {    //这句代码执行,a 重新赋值了一个函数
 3   alert(1);  
 4 }
 5 a(); //  执行的是赋值后的函数,输出1
 6 function a () {  //定义语句,执行阶段跳过
 7   alert(2);  
 8 }
 9 a();  // 执行 输出1
10 var a = function (){ //a 重新赋值一个函数
11   alert(3);  
12 }
13 a(); //执行,输出3

练习7;

1 var  a =10;
2 function fn (){
3   alert(a); //输出undefined
4   var a = 1;
5   alert(a);   //输出1   
6 }
7 fn();
8 alert(a);//输出10

练习8;

1 fn();   //fn 执行,产生fn子作用域
2 alert(a); // 弹出undefined ,为全局作用域的a
3 var a = 10;  //定义全局的a ;  //执行 给变量a 赋值10
4 alert(a);  //弹出10;
5 function fn (){
6   var a =1;   //定义fn作用域的a
7 }

 

posted @ 2018-06-09 21:51  bibiguo  阅读(124)  评论(0)    收藏  举报