Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法使用父作用域变量_Javascript_Variables_Scope - Fatal编程技术网

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(重新声明?)