我正在尝试类似的事情:
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);
}
});
});
答案 0 :(得分:7)
当然它将是undefined
,因为您在字符ready
上收听'document'
事件而不是变量document
。不要用单引号或双引号括起变量document
,否则ready
事件永远不会触发,因此永远不会定义变量。另外,请勿使用usernameDone
重新声明变量var usernameDone = true;
,只需为此usernameDone = true;
分配一个值,因为它已经定义。
答案 1 :(得分:2)
在函数内部分配值时删除var
,var
将变量设为私有。
答案 2 :(得分:1)
问题在于
var loginUsername = $(this).val();
$(this).val('');
var usernameDone = true; // <-- PROBLEM HERE
你在keypress方法中重新定义变量..所以它是未定义的..
删除var
部分
usernameDone = true;
你会没事的。
答案 3 :(得分:1)
您在最后一个if语句中重新声明该变量。由于第二个声明发生在子作用域(函数)中,但是在调用警报之后,javascript解析器正在等待分配新值,并且在此之前它是未定义的。
如果删除var,你会没事的。
答案 4 :(得分:1)
这里需要一些解释:
Douglas Crockford建议您将所有JavaScript变量声明在最近范围的顶部,因为这是Javascript在解释代码时所起的作用。
这个词被称为“吊装”。
这是一个很好的例子,可以解释为什么不这样做以及为什么他的JSLint工具突出了这一点。
您最近的范围是上面的函数。 JavaScript没有“阻止”范围,if
块没有定义任何本地范围。
因此,在您的示例中,声明有效地移动到函数的顶部,并且稍后进行分配(在您执行此操作时)。这意味着事实上,在检查变量时,变量是未定义的,因为它会重载上面范围中声明的变量。
答案 5 :(得分:0)
两件事:
usernameDone
将在何时定义
您的<document>
标记已完整
加载。关于偶然的那些
不存在,你想要的
$(document).ready()
。usernameDone
?我的示例中没有看到alert
函数,因此我只能假设您尝试在$(document).ready()
之外访问它。那不行。如果您需要该功能,请在该功能块的之外声明var usernameDone
。以下示例运行正常:
$(document).ready(function() {
var usernameDone = false;
alert(usernameDone);
});
和
var usernameDone;
function testMe() {
alert(usernameDone);
}
$(document).ready(function() {
usernameDone = false;
testMe();
});