预解析(代码提升)
1 //1) 2 console.log(a); 3 var a=10 4 // 以上发生域解析,将var a申明提前,相当于如下 5 var a; 6 console.log(a); 7 a=10; 8 9 //2) 10 console.log(fun); 11 function fun(){ 12 console.log("fun"); 13 } 14 // 函数声明发生域解析,将整个函数提前,相当于如下 15 function fun(){ 16 console.log("fun"); 17 }; 18 19 console.log(fun);
//预解析:预解释 还叫代码提升
//在程序开始执行后,代码执行之前,会发生预解析
//预解析会发生在 函数声明定义的函数 和 带var的变量身上
//代码开始执行之前会预解析:预解析分为两步:
//1、先预解析 函数声明定义的函数,函数重名会发生覆盖,
//2、再预解析 带var的变量(预解析不会带着值,只会提升变量),变量名重复会忽略;
//注意:函数如果是函数表达式定义的,当做带var的变量去对待
// 变量如果是不带var定义的,不会发生预解析
函数内部也要做预解析,预解析是在函数调用才开始的,解析和全局一样
例题:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 10 //预解析:预解释 还叫代码提升 11 //在程序开始执行后,代码执行之前,会发生预解析 12 13 //预解析会发生在 函数声明定义的函数 和 带var的变量身上 14 //代码开始执行之前会预解析:预解析分为两步: 15 //1、先预解析 函数声明定义的函数,函数重名会发生覆盖, 16 //2、再预解析 带var的变量(预解析不会带着值,只会提升变量),变量名重复会忽略; 17 //注意:函数如果是函数表达式定义的,当做带var的变量去对待 18 // 变量如果是不带var定义的,不会发生预解析 19 20 21 // console.log(a);//undefined 22 // var a; 23 24 25 //1) 26 27 // alert(a);//报错 28 // a = 0; 29 30 31 //2) 32 33 alert(a); 34 var a=0; 35 alert(a) 36 // 预解析后 37 // var a; 38 // alert(a); // undefined 39 // a = 0; 40 // alert(a); // 0 41 42 //3)注意看看 43 44 // var a = [1,2,3]; 45 // alert(a);//[1,2,3] 46 // var a = function(){}; 47 // console.log(a);//function(){}; 48 49 50 // function a(){ alert('我是函数') } 51 //// var a//提升上来后发现和上面的变量名重复,会忽略掉 52 // alert(a); // function a(){ alert('我是函数') } 53 // 54 //// 注意: 函数声明定义的函数和函数表达式定义的函数有2个区别,除此以外,同等对待 55 // //1、预解析的时候有区别 56 // //2、打印的时候有区别,函数声明定义的函数会带名字打印,函数表达式定义的不带名字 57 // a = '我是变量'; 58 // alert(a); 59 60 //4) 61 62 alert(a); 63 a++; 64 alert(a); 65 var a = '我是变量'; 66 function a(){ alert('我是函数') } 67 alert(a) 68 69 // 预解析后 70 // function a(){ alert('我是函数') } 71 //// var a 72 // alert(a); //function a(){ alert('我是函数') } 73 // a++;// ++是一个算术运算符(自增自减)NaN 74 // alert(a);//NaN 75 // a = '我是变量'; 76 // alert(a) //'我是变量'; 77 78 //5 79 80 alert(a); 81 var a = 0; 82 alert(a); 83 function fn(){ 84 alert(a); 85 var a = 1; 86 alert(a); 87 } 88 fn() 89 alert(a); 90 91 //全局预解析 92 // function fn(){ 93 // //函数内部也要做预解析,预解析是在函数调用才开始的,解析和全局一样 94 // var a; 95 // alert(a); //undefined 96 // a = 1; 97 // alert(a); //1 98 // }; //var fn = function(){} 99 // 100 // var a; 101 // alert(a);//undefined 102 // a = 0; 103 // alert(a); //0 104 // fn() 105 // alert(a); // 0 106 107 108 //6、 109 110 alert(a); 111 var a = 0; 112 alert(a); 113 function fn(){ 114 alert(a); 115 a = 1; 116 alert(a); 117 } 118 fn() 119 alert(a); 120 // 预解析后 121 122 // function fn(){ 123 // alert(a); // 0 124 // a = 1;//隔山打牛改全局为1 125 // alert(a); //1 126 // } 127 // 128 // var a; 129 // alert(a);//undefined 130 // a = 0; 131 // alert(a);//0 132 // fn() 133 // alert(a); // 1 134 135 136 137 //7、 138 139 // function fn(){ 140 // alert(a); 141 // a = 1; 142 // alert(a); 143 // } 144 145 function fn(){ 146 var a 147 alert(a);//undefined 148 a = 1; 149 alert(a);//1 150 }//var fn = function(){}; 151 152 var a; 153 // var fn; 154 // var a 155 alert(a); //undefined 156 a = 0; 157 alert(a); //0 158 fn(); 159 160 fn = function(){ 161 alert(a); // 0 162 a = 1; 163 alert(a);//1 164 } 165 166 fn(); 167 168 169 170 a = 100; 171 alert(a); //100 172 173 </script> 174 </body> 175 </html>