首先,我想说我在javascript中搜索有关范围变量的一些信息(例如What is the scope of variables in JavaScript?),我试图理解为什么我的代码表现得像那样,但最后我真的不知道。我无法在函数中覆盖函数中的var a,我只能使用不带var的a = 6;
来执行此操作。为什么在if语句和覆盖此变量之前未定义?为什么没有这样的结果:
5
等于5
等于6
我有类似的东西:
未定义
不等于5
等于6
这是我的代码:
var a = 5;
function something(){
console.log(a);
if(a == 5){
console.log('equal 5')
}
else{
console.log('not equal 5');
}
var a = 6;
function test(){
if(a == 6){
console.log('equal 6');
}
else{
console.log('not equal 6')
}
}
test();
}
something();
答案 0 :(得分:5)
这是因为javascript变量提升。
您的代码等于:
var a = 5;
function something(){
var a; // here
console.log(a); // a is the local variable which is undefined
if(a == 5){
console.log('equal 5')
}
else{
console.log('not equal 5'); // a is undefined so not equal 5
}
a = 6; // a is assigned to 6
function test(){
if(a == 6){
console.log('equal 6'); // a is 6 here
}
else{
console.log('not equal 6')
}
}
test();
}
something();
答案 1 :(得分:1)
因为当您第二次宣布var a = 6
的第一次声明,即a
时,我宣布var a = 5
。因此,当您定义函数something()
时,尚未定义a
,因此console.log(a)
将返回undefined。
但是当您用a
替换a = 6
的第二个声明时,第一个声明仍然有效,之后您只需更改a
的值,这样您就可以得到预期结果:< / p>
5
equal 5
equal 6
有关详细讨论,请参阅this post。