2017-04-26 48 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

对于这个问题,我们不需要**又一个**答案。 –

相关问题