2013-04-18 31 views
1

对于currentUnknownBox,如果我使用“var”,预期的功能不能按预期工作(currentUnknownBox成为第一个单击的元素)。如果我删除了var,它会按预期工作。我认为这与全球范围有关。有人可以向我解释这一点吗?JavaScript scope - var vs global

jQuery(".box.unknown").live('click',function() 
{ 
    var currentUnknownBox = this; 

    //if we are NOT on mobile, use jQuery UI dialog 
    if (!Drupal.settings.is_mobile) 
    { 
     jQuery("#letter-input-dialog").dialog(); 

     jQuery('#letter_input_form').submit(function() 
     { 
      var letter = jQuery("#letter_input").val(); 
      jQuery("#letter-input-dialog").dialog('close'); 
      jQuery("#letter_input").val(''); 
      that.validateAndSaveLetter(currentUnknownBox, letter); 
      //Do not let the form actually submit 
      return false; 
     }); 
    } 
    else 
    { 
     var letter = prompt('Please enter a letter to use in your guess'); 
     that.validateAndSaveLetter(that.currentUnknownBox, letter); 
    } 
}); 

编辑: 的问题是,我每次都重新声明我提交功能。

+0

哪里定义'that'? –

+0

'currentUnknownBox'似乎很好,但那是什么?那么为什么在'that'变量(预计在else子句中)还有'currentUnknownBox'属性呢? – Bergi

+0

与你的问题无关,但在JS花括号的安置问题,应该不应该在自己的行:http://stackoverflow.com/questions/3641519/why-results-varies-upon-placement-of-curly-大括号中的JavaScript代码 –

回答

3

问题是,每次单击其中一个时,就会向您的表单添加一个新的提交事件处理程序。但第一个总是会先开火。当你不声明var时,你覆盖了第一个处理程序正在查看的变量。但错误是每次都添加一个新的处理程序。我会做它像这样:

var currentUnknownBox; 
jQuery('#letter_input_form').submit(function() 
    { 
     var letter = jQuery("#letter_input").val(); 
     jQuery("#letter-input-dialog").dialog('close'); 
     jQuery("#letter_input").val(''); 
     that.validateAndSaveLetter(currentUnknownBox, letter); 
     //Do not let the form actually submit 
     return false; 
    }); 
jQuery("#letter-input-dialog").dialog({autoOpen: false}); 

jQuery(".box.unknown").live('click',function(){ 
    currentUnknownBox = this; 

    //if we are NOT on mobile, use jQuery UI dialog 
    if (!Drupal.settings.is_mobile) 
    { 
     jQuery("#letter-input-dialog").dialog('open'); 
     } else { 
     var letter = prompt('Please enter a letter to use in your guess'); 
     that.validateAndSaveLetter(currentUnknownBox, letter); 
     } 
}); 

顺便说一句,.live已被弃用。您应该改用.on

0

你忘了声明var'that'。 我认为你需要之前做这个“如果”语句

var that = this; 
+0

看编辑,我想我想通了 –

+0

在哪里?我不知道你在哪里重新宣布。 –

+1

请参阅[丹的答案](http://stackoverflow.com/a/16088927/363701)。这个代码:''jQuery('#letter_input_form')。submit(function(){...''每次点击'.box.unknown'时都会运行,给'#letter_input_form'增加一个新的事件处理函数 –

1

每当你使用var你声明一个变量的范围。如果你忽略它,那么JavaScript会采用全球最兼容的选项。技术术语是“hoisting”。为了更准确,JavaScript具有所谓的功能范围,因此即使您在for循环中声明变量,JavaScript也会将它“提升”到最接近的函数的顶部。