2014-12-25 81 views
3

提升時,變量優先於函數定義還是其他方式?請參閱下面的代碼:Javascript - 提升優先

function a() 
{ 
    var x = 10; 

    function x() { 
     return 20; 
    } 

    return x; 
} 
+0

我不會寫代碼,你有變量x和函數x。 x已經被定義。它令人困惑的代碼並不需要。在代碼審查中,我會讓程序員改變。變量被提升到範圍的頂部,然後分配到他們被調用的地方。 –

+0

在ECMAScript 5.1下,沒有關於提升的討論。所以你不應該依賴任何具體的實現。最佳做法是在範圍頂部聲明變量,然後在聲明後進行初始化。 –

回答

1

這不是一個了結優先於其他(有優先級發生,但是這在很大程度上只是一種語義的物質)的問題。

這裏重要的是,該變量聲明的分配部分懸掛,而整個函數定義

注意根據raina77ow的回答,似乎我原來假設的一部分是錯誤的。函數在變量聲明之前被掛起,但實際效果是一樣的。

吊裝後,你的功能會像這樣:

function a() 
{ 
    var x = function x() { // hoisted function declaration/definition 
     return 20; 
    }; 
    var x;     // hoisted variable declaration 
    x = 10;     // unhoisted part of variable declaration 
    return x; 
} 

x = 10發生全部吊裝完成後,所以這是留在x值。


要回復@ thefourtheye的要求(我想這是他/她是要求),如果您的原始功能是這樣的:

function a() { 
    function x() { 
     return 20; 
    } 
    var x = 10; 
    return x; 
} 

然後吊裝後,它看起來像這樣(同以上):

function a() { 
    var x = function x() { // hoisted function declaration/definition 
     return 20; 
    } 
    var x;     // hoisted variable declaration (does nothing) 
    x = 10;     // unhoisted variable assignment 
    return x; 
} 

作爲最後一個例子,嘗試:

function a() { 
    console.log(x); 
    var x = 10; 
    console.log(x); 
    function x() { return 20; }; 
} 

調用時,這個打印出:

function x() { return 20; } 
10 

這樣做的原因是,提升導致的功能這樣的表現:

function a() { 
    var x = function x() { return 20; }; 
    var x; 
    console.log(x); 
    x = 10; 
    console.log(x); 
} 
+0

請交換'var'和'function'並將其推理。 – thefourtheye

+0

@thefourtheye編輯我的答案。那是你要求的嗎?我不確定我瞭解你的要求。 – JLRishe

+0

'這不是變量在提升時優先 - 所以,函數定義是優先的,對吧? – thefourtheye

1

你的代碼就等於以下內容:

function a() { 
    var x; 
    function x() { // this function is assigned to variable indicator "x" 
    return 20; 
    } 
    x = 10; // this overrides the variable indicator "x" 
    return x; 
} 

所以,當你調用該函數:

a() // 10