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 }
浙公网安备 33010602011771号