變量聲明與函數聲明提前簡單分析

文中部分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(“我是函數")}

若文中有不對之處,敬請指出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章