jQuery变量总是计算为'undefined'

时间:2011-06-24 08:40:06

标签: jquery

我正在尝试类似的事情:

var usernameDone = false;
/*Some application logic*/
alert(usernameDone);

这始终是评估undefined。但是,如果我将变量名称从usernameDone更改为其他任何内容,甚至是usrnameDone,则脚本运行正常。 usernameDone与jQuery冲突吗?如果没有,那为什么会发生呢?

(我目前正在使用jQuery-1.6.1在Chrome上进行测试,但尚未尝试其他浏览器。)

[更新]
即使应用程序逻辑被消除,变量的计算结果为undefined

[更新-2完整代码]
我已使用//条评论

标记了用法
 $('document').ready( function() {

/**
 * The following set manages the effects for the login menu. The effects including highlighting
 * the login box when focused, showing guidance through a pop-up menu and handling transformation
 * through fade effects.
 * 
 */
var usernameDone = false;      //Declared here
/**
 * @function login-box focus()
 * Handles the onFocus() effects of the login box and displays the initial guidance pop-up box.
 * 
 */

$('#login-box').focus( function() {

/**
 * Color change effect of the login box
 */

    $(this).css('background-color' , '#000');
    $(this).css('color' , '#FFF');
    $(this).css('border' , '2px solid #000');

/**
 * Fade in effect of the login guide
 */

    $('#login-guide').fadeIn(1200);
    $('#login-guide-triangle').fadeIn(1200);

});


/**
 * @function login-box focusout()
 * Handles the focusOut effects of the login box and hides the guidance pop-up box.
 * 
 */

$('#login-box').focusout( function() {

/**
 * Color change effects of the login box
 */

    $(this).css('background-color' , '#FFF');
    $(this).css('color' , '#000');
    $(this).css('border' , '3px solid #000');

/**
 * Fade out effect of the login guide
 */

    $('#login-guide').fadeOut(1200);
    $('#login-guide-triangle').fadeOut(1200);
});

/**
 * @function login-box bind(keypress)
 * Handles the progression of the login steps. Specifically, what state the login box is in 
 * (ie, username or password) and how to respond when the state change key ('return/enter key')
 * is pressed.
 * 
 */

$('#login-box').bind('keypress' , function(e) {
/**
 * Checks for the current state (using usernameDone) if not, then registers the current username
 * changes the state to username done and converts the login box into password. Also, changes the
 * guidance contents.
 */
    alert(usernameDone);    //Always undefined (no modification before this)
    if(e.keyCode == 13 && usernameDone == false) {    //Owing to undefined it never evaluates to true.
        var loginUsername = $(this).val();
        $(this).val('');
        var usernameDone = true;
        $(this).fadeOut(0);
        document.getElementById('login-box').setAttribute('type' , 'password');
        $('#login-guide-title').html('Password');
        $('#login-guide-info').html('Press enter to login');
        $(this).fadeIn(800);
    }
});

});

6 个答案:

答案 0 :(得分:7)

当然它将是undefined,因为您在字符ready上收听'document'事件而不是变量document。不要用单引号或双引号括起变量document,否则ready事件永远不会触发,因此永远不会定义变量。另外,请勿使用usernameDone重新声明变量var usernameDone = true;,只需为此usernameDone = true;分配一个值,因为它已经定义。

答案 1 :(得分:2)

在函数内部分配值时删除varvar将变量设为私有。

答案 2 :(得分:1)

问题在于

    var loginUsername = $(this).val(); 
    $(this).val('');
    var usernameDone = true;  // <-- PROBLEM HERE

你在keypress方法中重新定义变量..所以它是未定义的..

删除var部分

usernameDone = true;

你会没事的。

demo http://jsfiddle.net/gaby/3CrZG/1/

答案 3 :(得分:1)

您在最后一个if语句中重新声明该变量。由于第二个声明发生在子作用域(函数)中,但是在调用警报之后,javascript解析器正在等待分配新值,并且在此之前它是未定义的。

如果删除var,你会没事的。

答案 4 :(得分:1)

这里需要一些解释:

Douglas Crockford建议您将所有JavaScript变量声明在最近范围的顶部,因为这是Javascript在解释代码时所起的作用。

这个词被称为“吊装”。

这是一个很好的例子,可以解释为什么不这样做以及为什么他的JSLint工具突出了这一点。

您最近的范围是上面的函数。 JavaScript没有“阻止”范围,if块没有定义任何本地范围。

因此,在您的示例中,声明有效地移动到函数的顶部,并且稍后进行分配(在您执行此操作时)。这意味着事实上,在检查变量时,变量是未定义的,因为它会重载上面范围中声明的变量。

答案 5 :(得分:0)

两件事:

  1. usernameDone将在何时定义 您的<document>标记已完整 加载。关于偶然的那些 不存在,你想要的 $(document).ready()
  2. 您在哪里尝试访问usernameDone?我的示例中没有看到alert函数,因此我只能假设您尝试在$(document).ready()之外访问它。那不行。如果您需要该功能,请在该功能块的之外声明var usernameDone
  3. 以下示例运行正常:

    $(document).ready(function() {
      var usernameDone = false;
      alert(usernameDone);
    });
    

    var usernameDone;
    
    function testMe() {
      alert(usernameDone);
    }
    
    $(document).ready(function() {
      usernameDone = false;
      testMe();
    });