在JavaScript中,为什么这个全局变量在我的函数中变得不确定?

时间:2017-04-26 12:56:25

标签: 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 truex值为undefined,我想了解变量声明在javascript中的工作原理。任何参考资料也很有帮助 的更新
任何人都可以解释为什么变量被重新声明为未定义以及它如何与javascript中的提升相关

2 个答案:

答案 0 :(得分:2)

因为func本质上是:

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

JavaScript中的变量具有函数范围,而不是您可能熟悉其他语言的块范围。这导致您观察到的hoisting行为:

  

在编译阶段将 变量和函数声明放入内存 会发生什么,但仍然保留在编码中输入的位置。

     

...

     

JavaScript仅提升声明,而不是初始化。 强调我的

即使在func内部x内部if声明x,在编译期间,其声明将移至功能级别shadows {{1在全球范围内。但是,如果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));

答案 1 :(得分:-2)

您在函数中定义了一个新变量var x,因此会覆盖外部变量x