2016-07-31 58 views
0

我正在研究Javascript的執行上下文。但我不明白爲什麼「函數foo」不會被「var foo」覆蓋。 我希望有人能解釋一下, 感謝你的回覆。執行上下文聲明名稱兩次?

功能ACE(){

console.log(typeof foo); // function pointer 
console.log(typeof bar); // undefined 

var foo = 'hello', 
    bar = function() { 
     return 'world'; 
    }; 

function foo() { 
    return 'hello'; 
} 
var foo = 'hello'; 

}

ACE();

+0

'foo'被覆蓋 – guest271314

回答

0

爲什麼「函數foo」不會被「var foo」覆蓋。

foo在哪裏foo重新定義的線被覆蓋

function ace() { 
 

 
    console.log(typeof foo); // function pointer 
 
    console.log(typeof bar); // undefined 
 

 
    var foo = 'hello', 
 
    bar = function() { 
 
     return 'world'; 
 
    }; 
 

 
    function foo() { 
 
    return 'hello'; 
 
    } 
 
    var foo = 'hello'; 
 
    console.log(foo); 
 
    try { 
 
    foo() 
 
    } catch(e) { 
 
    console.log("catch:", e.message) 
 
    } 
 
} 
 

 
ace();

0

但我不明白爲什麼「函數foo」不將超過寫的「var foo」。

var聲明不覆蓋函數聲明。它們都聲明相同的變量,並且由於函數聲明,它使用函數進行初始化。只有這個任務會覆蓋這個值。

如果你把吊裝進去,你的腳本會像

function ace() { 
    var foo, bar; 
    var foo = function() { 
     return 'hello'; 
    } 
    var foo; 

    console.log(typeof foo); // function 
    console.log(typeof bar); // undefined 

    foo = 'hello'; 
    bar = function() { 
     return 'world'; 
    }; 
    console.log(typeof foo); // string 
    foo = 'hello'; 
} 
ace(); 
+0

感謝您respons。但是函數沒有在變量之前的激活對象上創建?但爲什麼「函數foo」的名稱會被「var foo」覆蓋?對不起,即時通訊試圖瞭解它 – Overste

+0

@Overste:函數不是特殊類型的變量。函數聲明只是聲明一個變量並用函數對象初始化它。變量聲明只聲明相同的變量,除非它已經存在,用'undefined'初始化它。 '函數foo'不被'var foo'覆蓋 - 'foo'被'foo = ...'覆蓋。 – Bergi

+0

謝謝你的回覆。我想我明白了,謝謝。但我有最後一個問題:我讀文章,他說:即使foo被聲明瞭兩次,我們從創建階段就知道函數是在變量之前在內存中創建的。是不是:var foo = function(){ return'hello'; }和var foo,bar; – Overste