变量声明(定义变量)提升:
在预编译阶段,编译器会把所有定义的变量全部提升到最顶部,即,把变量声明的语句会自动放置到开始。换句话说,经过预编译后,在任何函数里,一开始是全部的变量声明。
//示例一: /* function func1(){ alert(v1); var v1; } //等价于(即预编译后): function func1(){ var v1; alert(v1); } */ //示例二: /* function func1(){ alert(v1);//弹出undefined,因为,只做声明的提升,不做赋值的提升 var v1=5; } //等价于(即预编译后): function func1(){ var v1;//声明提升了,但是赋值没有提升 alert(v1); v1=5; } */ /* //示例三: function func1(){ alert(i);//弹出 undefined,因为,只做声明的提升,不做赋值的提升 alert(j);//弹出 undefined,因为,只做声明的提升,不做赋值的提升 for(var i=0;i<10;i++){ for(var j=0;j<10;j++){ } } } //等价于: function func1(){ var i; var j; alert(i); alert(j); for(i=0;i<10;i++){ for(j=0;j<10;j++){ } } } */
如果有全局变量,并且全局变量和局部变量重名
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <input type="button" value="测试" onclick="func1()" /><br/> </body> </html> <script type="text/javascript"> //示例一: var v1=200; function func1(){ alert(v1);//弹出undefined; var v1=300; } //等价于(预编译后): var v1=200; function func1(){ var v1; alert(v1);//弹出undefined; v1=300; } </script>