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