2017-04-26 46 views
-3

在JavaScript中,爲什麼這個全局變量在我的函數中變得未定義?

var x = 3; 
 
function func(randomize) { 
 
    if (randomize) { 
 
     var x = Math.random(); 
 
     return x; 
 
    } 
 
    return x; 
 
} 
 
console.log(func(false));

正如你可以從上面的代碼中,if statement never be true看到,但在xundefined,我想了解如何聲明變量在JavaScript的工作。任何參考也是有幫助的。
更新:
任何人都可以解釋爲什麼變量被重新宣佈爲未定義的,它是如何與在JavaScript吊裝

+0

經典吊裝 – nicovank

+2

我認爲-3是過度的。它有一個MCVE,雖然對於那些流利的JS可能是顯而易見的,但這不是一個可怕的問題。 – Carcigenicate

+0

我對JavaScript的託管知之甚少,但變量'x'被定義在函數之外,而且我們沒有返回函數引用' – nivas

回答

2

因爲func在本質上是:

function func(randomize) { 
    var x; 
    if (randomize) { 
     x = Math.random(); 
     return x; 
    } 
    return x; 
} 

變量在JavaScript中有功能範圍,而不是您可能從其他語言熟悉的範圍。這將導致你觀察hoisting行爲:

是什麼發生的是變量和函數聲明是在編譯階段放在內存中,但究竟會留在你在你的編碼輸入它。

...

的JavaScript只吊聲明,不初始化。重點挖掘

也就是說,即使裏面func您在if塊聲明x,在編譯時其聲明移至運作水平,使其在shadows全球範圍內x。但是,如果func的參數爲true,那麼它只是初始化爲,這導致您觀察到的行爲。

let參見:

"use strict"; 
 
var x = 3; 
 
function func(randomize) { 
 
    if (randomize) { 
 
     let x = Math.random(); 
 
     return x; 
 
    } 
 
    return x; 
 
} 
 
console.log(func(false)); 
 
console.log(func(true));

+0

我們不需要**又一個**回答這個問題。 –

+0

@Sinan unur他在說[this](http://stackoverflow.com/questions/37508842/javascript-variable-hoisting-confusion) –

+0

@JinsPeter好吧,如果[that](http://stackoverflow.com/問題/ 37508842/javascript-variable-hoisting-confusion)是所有提問題的*規範答案,那麼你或者TJ可能想要花一些精力來改進其介紹。 –

-2

你在你的函數定義一個新的變量var x,從而覆蓋外變量x

+1

對於這個問題,我們不需要**又一個**答案。 –

相關問題