【问题标题】:Why does my variable need a 'var' declaration, when it's already inside a var declaration?为什么我的变量已经在 var 声明中时需要“var”声明?
【发布时间】:2016-04-12 19:35:40
【问题描述】:

如果模组可以帮助我更好地表达我的问题,我将不胜感激,因为如果不提供示例就很难提出这个问题。这是我创建的一个函数:

$("#myField").on('keyup', function(event){
    var input = $(this), 
         val  = input.val(),
         inputGroup = input.parents('div.input-group')
         searchingIcon = $(inputGroup).find('i.auto-spinner'),
         button = $(inputGroup).find('span.input-group-btn > button.btn'),
         key = event.which,
         typingTimer; // This throws an error typingTimer is not defined

    //Clear typing timeout on keypress
    clearTimeout(typingTimer);
    //.... more code below.. not important
  });

如您所见,我喜欢用一个简单的 var 声明,后跟逗号来声明我的 var,但是,在这种情况下,当我进入 typingTimer 时,我得到一个未定义的 var 错误,就好像它正在寻找变量一样,而不是定义一个空变量。如果我只是把事情改成这样:

$("#myField").on('keyup', function(event){
    var input = $(this), 
         val  = input.val(),
         inputGroup = input.parents('div.input-group')
         searchingIcon = $(inputGroup).find('i.auto-spinner'),
         button = $(inputGroup).find('span.input-group-btn > button.btn'),
         key = event.which;
   var typingTimer; // All is well again...

    //Clear typing timeout on keypress
    clearTimeout(typingTimer);
    //.... more code below.. not important
  });

一切都会好起来的。这不是我第一次遇到这种现象,我真的不知道它的原因。我如何定义不由 (;) 分隔的变量是否有一些限制?

【问题讨论】:

  • 您在 inputGroup 声明后缺少逗号,导致该行后自动出现分号。因此,所有后续的赋值都不是声明;它们只是对现有变量的赋值(如果不存在同名变量,则赋值给隐式全局变量)。我不确定是否将其作为拼写错误关闭,或者回答它,因为其他人可能会犯同样的拼写错误?
  • “这不是我第一次遇到这种现象”:也许是时候改变声明变量的方式了?
  • 确实如此。这不是现象,是代码不正确。

标签: javascript variables


【解决方案1】:

在您的一个声明 inputGroup = input.parents('div.input-group') 之后缺少一个逗号。由于您的所有其他声明也是一个表达式(它们后面有一个 = 符号),它们本身就是有效的语句(将结果分配给全局变量)。不过,typingTimer 没有这样的赋值,所以它会导致未定义的错误。

添加缺少的逗号将解决问题。

【讨论】:

  • 啊,一定是这样。我将不得不回去检查我的其他实例,但这可能是同一件事。我有很长的 var 声明。
【解决方案2】:

inputGroup 声明后缺少逗号,导致该行后自动出现分号。因此,所有后续的赋值都不是声明;它们只是任务..

我们可以通过显式编写隐式分号更清楚地说明您的代码的问题:

// declarations
var input = $(this), 
     val  = input.val(),
     inputGroup = input.parents('div.input-group');

// merely assignments
     searchingIcon = $(inputGroup).find('i.auto-spinner'),
     button = $(inputGroup).find('span.input-group-btn > button.btn'),
     key = event.which,
     typingTimer;

typingTimer 不存在,因此在赋值左侧以外的任何方式使用它都是无效的。上面的其他赋值语句是可以接受的,因为它们会创建隐式全局变量(因为您不是在严格模式下)。

如果在inputGroup 的赋值后添加逗号,那么后面的行就是声明,正如你所期望的那样。

【讨论】:

  • 我认为您的意思是 inputGroup = input.parents('div.input-group'), 或至少在 searchingIcon 之前的一个变量
  • @LCIII 在代码块中,我的意思是用一个等效的有问题的例子更清楚地说明问题,而不是提供解决方案。为清晰起见进行了编辑。
猜你喜欢
  • 2011-04-23
  • 1970-01-01
  • 2012-04-29
  • 2016-08-19
  • 2015-03-14
  • 2018-09-19
  • 2011-12-12
  • 2015-05-02
  • 1970-01-01
相关资源
最近更新 更多