Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我不能在jQuery';s document.ready()?_Javascript_Jquery - Fatal编程技术网

Javascript 为什么我不能在jQuery';s 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()函数中,它们将显示为未定义函数:

$(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()的作用域之外可见。有关函数声明和函数表达式之间差异的说明,请参见