文中部分demo源自网上。
//demo1 function test(){ var num = 123; console.log(num); //123 } test(); console.log(num); //error //demo2 var str= “我是Global”; test(); function test() { console.log(str); //undefined var str= "哈哈哈”; console.log(str); //“哈哈哈" } console.log(str); //“我是Global” //demo3 function test(){ if("a" in window){ var a = 10; //提升到函数作用域最前 if语句没有作用域 } console.log(a); //undefined } test(); //demo4 if("a" in window){ var a = 10; //if没有作用域,if提升到最前面,window中有a } console.log(a); //10 //demo5 if(!"a" in window){ var a = 10; //变量提升,没有进入判断语句 } console.log(a); //undefined //demo6 var foo = 1; function bar() { if(!foo) { var foo = 10; } console.log(foo); //10 } bar(); //申明foo -> 申明bar -> 赋值foo=1 -> 调用bar() -> 申明foo(函数体内) -> 赋值foo(函数体内) //demo7 var foo; function bar() { var foo; if(!foo){ foo = 10; } console.log(foo); //10 } foo = 1; bar(); //demo8 1. function bar() { 2. return foo; //return 在foo赋值之前,若在foo赋值之后,则被重写为number类型 3. foo = 10; 4. function foo() {} 5. var foo = 11; 6. } 7. alert(typeof bar());//function //demo9 var a=100; function a(){ console.log(a); } a(); //a is not function 变量和函数重名时,函数优先级更高 a后赋值为100重写了a //demo10 形参与变量申明重名 function ab(x){ console.log(x); var x = 4; console.log(x); }; ab(3); // 3 4 在函数中申明的变量被赋值后,顶替原来的形参,若申明没赋值,则值还是形参的值 //demo11函数中申明的函数与形参重名 function ab(x){ console.log(x); function x(){ console.log("我是函数") }; console.log(x); }; ab(3); //function x(){console.log(“我是函数”)} function x(){console.log(“我是函数")}
若文中有不对之处,敬请指出。
文章来源: 变量声明与函数声明提前简单分析