无法更改jQuery对象变量。这是一个范围问题吗?

无法更改jQuery对象变量。这是一个范围问题吗?,jquery,Jquery,我有一个简单的脚本,可以用箭头键在屏幕上移动精灵。我想在名为$s的变量中包含对我的$('#sprite')的引用。但是,根据我在哪里声明和初始化$s,我会得到一个工作函数或一个非工作函数。为什么会这样 编辑:区别在于我在哪里声明和初始化$s。我不小心把同一个代码段放了两次,但现在已经修复了 这不起作用: $(document).ready(main()); 函数main(){ var$s=$(“精灵”); 变量时间='快速'; $(文档).keydown(函数(e){ //var$s=$(“精

我有一个简单的脚本,可以用箭头键在屏幕上移动精灵。我想在名为
$s
的变量中包含对我的
$('#sprite')
的引用。但是,根据我在哪里声明和初始化
$s
,我会得到一个工作函数或一个非工作函数。为什么会这样

编辑:区别在于我在哪里声明和初始化
$s
。我不小心把同一个代码段放了两次,但现在已经修复了

这不起作用:

$(document).ready(main());
函数main(){
var$s=$(“精灵”);
变量时间='快速';
$(文档).keydown(函数(e){
//var$s=$(“精灵”);
console.log($s);
key=e
开关(钥匙){
案例37://左
$s.animate({左:“-=10px”},时间);
控制台日志(“左”);
打破
案例38://以上
$s.animate({top::-=10px},时间)
控制台。登录(“up”);
打破
案例39://对
$s.animate({左:+=10px},时间)
控制台日志(“右”);
打破
案例40://向下
$s.animate({top:+=10px},时间)
控制台。登录(“关闭”);
打破
违约:
打破
}
});

};区别在于您是在keydown处理程序内部还是外部声明
$s
?让我们从一开始就看看发生了什么:

$(document).ready(main());
您正在调用函数
main
,并将其返回值传递给
$(document).ready()
。这不是你想做的。在这里,
main
立即执行。你想要的是:

$(document).ready(main);
不带括号,只传递对函数的引用

为什么这很重要

当您立即调用该函数时,DOM还没有准备好,如果它是在外部函数中定义的,
$s
则没有值。但是,当您在内部函数中设置它时,
$s
直到您按下一个键并且元素存在时才会被设置


所以说真的,任何一个都应该有效。问题出在另一行代码中。

区别在于是在keydown处理程序内部还是外部声明
$s
?让我们从一开始就看看发生了什么:

$(document).ready(main());
您正在调用函数
main
,并将其返回值传递给
$(document).ready()
。这不是你想做的。在这里,
main
立即执行。你想要的是:

$(document).ready(main);
不带括号,只传递对函数的引用

为什么这很重要

当您立即调用该函数时,DOM还没有准备好,如果它是在外部函数中定义的,
$s
则没有值。但是,当您在内部函数中设置它时,
$s
直到您按下一个键并且元素存在时才会被设置


所以说真的,任何一个都应该有效。问题在于另一行代码。

这两行代码是相同的

改变第一行

// $(document).ready( main() );
   $(document).ready( main );

两个代码都是相同的

改变第一行

// $(document).ready( main() );
   $(document).ready( main );

这两者有什么区别?您正在立即调用
main
。将引用传递到
.ready()
,例如
.ready(main)
这两者之间的区别是什么?您正在立即调用
main
。将引用传递到
.ready()
,例如
.ready(main)