无法使用父范围变量

时间:2015-07-29 03:39:26

标签: javascript variables scope

我有一个全局(我认为)变量,它在第一行声明。在它之后的函数中,我的意思是使用它,但计算机告诉我变量是未定义的。这是范围问题,我该如何解决?

这是我的代码:

    var menustatus = 0;

    function menuconfig() {
      if (menustatus === 0) {
        $('.menuhead2').animate({
          top: "400px"
        }, 300)

        $('.menuhead3').animate({
          top: "400px"
        }, 300)
        var menustatus = 1
      }
    }

3 个答案:

答案 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日志未定义,因为您的变量在声明之后被分配。