我有一个全局(我认为)变量,它在第一行声明。在它之后的函数中,我的意思是使用它,但计算机告诉我变量是未定义的。这是范围问题,我该如何解决?
这是我的代码:
var menustatus = 0;
function menuconfig() {
if (menustatus === 0) {
$('.menuhead2').animate({
top: "400px"
}, 300)
$('.menuhead3').animate({
top: "400px"
}, 300)
var menustatus = 1
}
}
答案 0 :(得分:1)
一开始我提供解决方案,如果有人有兴趣知道发生了什么,请继续阅读。
只需从函数范围menustatus中删除 var 关键字即可。它将在那时解决。
所以而不是
var menustatus = 1
写
menustatus = 1
这是因为javascript提升而发生的。 Javascript将任何变量声明(仅)浮动到范围的顶部。所以你的代码实际上是这样的:
var menustatus = 0;
function menuconfig() {
//It's floated on top of the scope
var menustatus;
if (menustatus === 0) {
$('.menuhead2').animate({
top: "400px"
}, 300)
$('.menuhead3').animate({
top: "400px"
}, 300)
menustatus = 1
}
}
因此在执行此行时:
if(menustatus === 0)
它找到了未定义的范围变量 menustatus 。还有一件事需要注意,它只是提升声明,而不是转让。
如果我们删除 var
menustatus = 1
那么你的代码实际上是这样的:
var menustatus = 0;
function menuconfig() {
//Nothing is hoisted here
//As no variable is declared here
if (menustatus === 0) {
$('.menuhead2').animate({
top: "400px"
}, 300)
$('.menuhead3').animate({
top: "400px"
}, 300)
menustatus = 1
}
}
当您声明任何变量时,它不会浮动在顶部。
答案 1 :(得分:1)
您在menustatus
方法中声明了一个名称相同的本地变量menuconfig
:
var menustatus=0;
function menuconfig(){
if(menustatus===0){
$('.menuhead2').animate({
top:"400px"
},300)
$('.menuhead3').animate({
top:"400px"
},300)
// var menustatus=1
// replace with (notice no 'var')
menustatus=1;
}
}
发生这种情况的原因是JavaScript首先在当前范围内查找匹配变量。
在JavaScript中,变量是函数范围的,这意味着它在当前函数中查找名为menustatus
的变量。由于它找到了一个,它首先使用这个变量。
如果找不到本地函数范围的变量,则JavaScript引擎会查看父范围。在此示例中,父范围是“全局”或window
范围。
答案 2 :(得分:0)
您的函数menuConfig()可以访问首次声明menustatus的全局范围。您的代码中的问题是您在menuConfig()函数中进行了赋值,然后,全局menustatus被函数范围中的menustatus变量覆盖。因此,JS日志未定义,因为您的变量在声明之后被分配。