Javascript 为什么我不能在jQuery的document.ready()中定义函数?

Javascript 为什么我不能在jQuery的document.ready()中定义函数?,javascript,jquery,Javascript,Jquery,如果我将函数放在文档中,它们将显示为未定义。就绪函数: $(document).ready(function(){ function foo() { alert('Bar'); } }); foo(); // Undefined 为什么会发生这种情况?我确信我只是需要一些简单的理解:您可以,但是必须在ready方法的范围内调用它们,否则当ready方法退出时它们将失去作用域 例如,下面的代码将起作用: $(document).ready(function(){ fun

如果我将函数放在文档中,它们将显示为未定义。就绪函数:

$(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>
显然,您不能在就绪后立即从内联脚本调用foo,因为就绪代码尚未运行,但您可以稍后调用该函数


只要确保在就绪代码运行之前,没有任何东西可以尝试调用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">
在$document.ready函数中声明函数或变量时,如果在文档中使用onclick绑定,则无法访问这些函数或变量


您可以将声明移到$document.ready之外,也可以使用$'element'。单击`$document.ready.

中的函数{},有什么方法可以解决这个问题吗?改变范围?很简单。在外部定义它们。准备就绪。。。范围我不明白你为什么这么喜欢那样做。它可能会给您带来什么好处?@Oli,从代码组织的角度来看,能够在.ready范围内声明它会更好。@James,从代码的角度来看,如果需要从ready范围内外调用它,请将foo函数视为库或API。在这种情况下,您需要使用所有必要的参数并给出一个结果,没有副作用。如果您需要使用一些参数调用foo呢?您将如何传递它们,以及如何接收它们?@alonso.torres:就像任何其他JavaScript函数一样:foo=functionx,y,z{…}。。。onclick=foo1,2,,3@RichieHindle请注意,声明函数的方式很重要,另请参见@RichieHindle,如果不添加var foo并将函数声明保留为发布foo=function{},那么变量foo将有全局范围分配给它。您只需执行console.logwindow.foo;加载函数后。@RichieHindle感谢您的解决方案,它工作正常@jj_uhariOMS解决方案之所以有效,是因为对myfnc的调用与在中声明的myfnc在同一范围内。是的,myfnc调用是,但input onclick事件中的myfncparam1、param2呢?因为myfnc实际上不是函数的名称。Hari Om创建一个匿名函数并将其分配给变量myfnc。由于变量myfnc是全局变量,除非用var声明,否则JScript中的变量具有全局作用域,因此它在ready的作用域之外是可见的。有关函数声明和函数表达式之间差异的说明,请参见