Javascript范围 - var vs global

时间:2013-04-18 16:45:14

标签: javascript scope

对于currentUnknownBox,如果我使用“var”,预期的功能将无法正常工作(currentUnknownBox成为第一个单击的元素)。如果我删除var,它按预期工作。我假设这与全球范围有关。有人可以向我解释一下吗?

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);
    }
});

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

3 个答案:

答案 0 :(得分:3)

问题在于,每次单击其中一个时,您都会在表单中添加 new 提交事件处理程序。但第一个将永远是第一个。当您不声明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代替。

答案 1 :(得分:1)

每当您使用var时,您都在声明变量的范围。如果省略它,则JavaScript假定最兼容的选项是全局的。技术术语是“hoisting”。更准确地说,JavaScript具有所谓的函数作用域,因此即使在for循环中声明变量,JavaScript也会将其“提升”到最近函数的顶部。

答案 2 :(得分:0)

你忘了声明var'那个'。 我想你需要在'if'语句之前做到这一点

var that = this;