Javascript 为什么我不能在jQuery';s document.ready()?
如果我将函数放在document.ready()函数中,它们将显示为未定义函数:Javascript 为什么我不能在jQuery';s document.ready()?,javascript,jquery,Javascript,Jquery,如果我将函数放在document.ready()函数中,它们将显示为未定义函数: $(document).ready(function(){ function foo() { alert('Bar'); } }); foo(); // Undefined 为什么会发生这种情况?我确信我只是需要一些简单的理解:)您可以,但是必须在ready()方法的范围内调用它们,否则当ready()方法退出时它们将失去作用域 例如,下面的代码将起作用: $(document).ready
$(document).ready(function(){
function foo()
{
alert('Bar');
}
});
foo(); // Undefined
为什么会发生这种情况?我确信我只是需要一些简单的理解:)您可以,但是必须在
ready()
方法的范围内调用它们,否则当ready()
方法退出时它们将失去作用域
例如,下面的代码将起作用:
$(document).ready(function(){
function foo()
{
alert('Bar');
}
foo(); // still in the scope of the ready method
});
您的函数是在
$(document).ready()
回调的范围内定义的,无法从外部看到。在$(document).ready()范围外定义函数,只能从内部调用。不确定为什么在ready()
范围内定义函数对您很重要,但您可以通过预先声明foo
使其工作:
<html><head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js"></script>
<script>
var foo; // Here's the difference
$(document).ready(function(){
foo = function ()
{
alert('Bar');
}
});
</script></head><body>
<input type="button" onclick="foo()" value="Click me">
</body></html>
var foo;//区别就在这里
$(文档).ready(函数(){
foo=函数()
{
警报(“条”);
}
});
显然,您不能在ready()
之后立即从内联脚本调用foo()
,因为ready()
代码尚未运行,但您可以稍后调用该函数
只要确保在ready()
代码运行之前,没有任何东西可以尝试调用foo()
(或者使foo()
的初始声明成为无害的函数)。如果将它们放在任何不属于它们的范围内,它们将显示为未定义。如果您真的想在$(document).ready(…)的范围之外使用它们,那么您需要在外部声明它们。例如:
var foo;
$(document).ready(function(){
foo = function()
{
alert('Bar');
}
});
foo(); // works now because it is in scope
希望这有帮助。
<script>
$(document).ready(function(){
myfnc = function (param1, param2)
{
alert('Hello');
}
myfnc();
});
</script>
<input type="button" onclick="myfnc('arg1', 'arg2')" value="Click me">
$(文档).ready(函数(){
myfnc=函数(参数1,参数2)
{
警惕(“你好”);
}
myfnc();
});
只是另一个补充:
在$(document).ready()函数中声明函数或变量时,在文档中使用onclick()
绑定时无法访问这些函数或变量
您可以将声明移到$(document.ready()
)之外,也可以使用$('#element')。在('click',function(){})
中的`$(document.ready()。有什么办法解决这个问题吗?改变范围?很简单。在.ready(…)范围之外定义它们。我不明白你为什么这么喜欢那样做。它可能会给您带来什么好处?@Oli,从代码组织的角度来看,能够在.ready()范围内声明它会更好。@James,从代码的角度来看,如果需要从ready()范围内外调用它,那么将foo()函数视为一个库或API。在这种情况下,您需要使用所有必要的参数并给出一个结果,没有副作用。如果您需要使用一些参数调用foo()
,该怎么办?您将如何传递它们,以及如何接收它们?@alonso.torres:就像任何其他JavaScript函数一样:foo=function(x,y,z){…}
onclick=“foo(1,2,3)”
@RichieHindle请注意,“声明函数的方式”很重要,请参见@RichieHindle,如果不添加var foo
并将函数声明保留为发布foo=function(){}
,则变量foo
将具有全局范围。您可以通过执行console.log(window.foo)来检查这一点代码>加载函数后。@RichieHindle感谢您的解决方案,它正在工作;)@jj_uhariOM的解决方案之所以有效,是因为对myfnc的调用与在中声明的myfnc在同一范围内。是的myfnc()
call是,但是在input onclick事件中myfnc(param1,param2)
呢?因为myfnc实际上不是函数的名称。Hari Om创建一个匿名函数并将其分配给变量myfnc。由于变量myfnc是全局变量(JScript中的变量具有全局作用域,除非用“var”声明),因此它在ready()的作用域之外可见。有关函数声明和函数表达式之间差异的说明,请参见