Javascript 无法使用父作用域变量
我有一个全局(我认为)变量,它在第一行声明。在它后面的函数中,我打算使用它,但计算机告诉我变量未定义。这是一个范围问题吗?如何解决 这是我的密码:Javascript 无法使用父作用域变量,javascript,variables,scope,Javascript,Variables,Scope,我有一个全局(我认为)变量,它在第一行声明。在它后面的函数中,我打算使用它,但计算机告诉我变量未定义。这是一个范围问题吗?如何解决 这是我的密码: var menustatus=0; 函数menuconfig(){ 如果(菜单状态===0){ $('.menuhead2')。设置动画({ 顶部:“400px” }, 300) $('.menuhead3')。设置动画({ 顶部:“400px” }, 300) var menustatus=1 } }首先,我提供解决方案,如果有人想知道发生了什么
var menustatus=0;
函数menuconfig(){
如果(菜单状态===0){
$('.menuhead2')。设置动画({
顶部:“400px”
}, 300)
$('.menuhead3')。设置动画({
顶部:“400px”
}, 300)
var menustatus=1
}
}
首先,我提供解决方案,如果有人想知道发生了什么,请继续阅读
解决方案
只需从函数范围菜单状态中删除var关键字。到时候问题就解决了
所以不是
var menustatus=1
写
menustatus=1
推理
这是因为javascript的提升。Javascript将任何变量声明(仅)浮动到作用域的顶部。因此,您的代码实际上如下所示:
var menustatus=0;
函数menuconfig(){
//它漂浮在范围的顶部
梅努斯塔斯变种;
如果(菜单状态===0){
$('.menuhead2')。设置动画({
顶部:“400px”
}, 300)
$('.menuhead3')。设置动画({
顶部:“400px”
}, 300)
menustatus=1
}
}
您在menuconfig
方法中声明了一个同名的局部变量(menustatus
):
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引擎将查看父作用域。在本例中,父作用域是“全局”或
窗口
作用域。您的函数menuConfig()可以访问第一次声明menustatus的全局作用域。代码中的问题是,在menuConfig()函数中进行赋值,然后全局menustatus被函数范围中的menustatus变量覆盖。因此,JS日志未定义,因为变量是在声明后分配的 为什么会有var menustatus=0,然后var menustatus=1(重新声明?)