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

IT技术 javascript jquery
2021-01-24 10:21:31

如果我将它们放在 document.ready() 函数中,函数就会显示为未定义:

$(document).ready(function(){
  function foo()
  {
    alert('Bar');
  }
});

foo(); // Undefined

为什么会发生这种情况?我确定我只需要一些简单的理解:)

6个回答

不确定为什么在范围内定义函数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()在之后立即从内联脚本调用ready()因为ready()代码尚未运行,但您可以稍后调用该函数。

只要确保foo()ready()代码运行之前没有任何东西可以尝试调用(或进行foo()无害函数的初始声明)。

@alonso.torres:就像任何其他 JavaScript 函数一样:foo = function(x, y, z) {...}...onclick="foo(1, 2, 3)"
2021-03-16 10:21:31
如果需要调用foo()一些参数怎么办?您将如何通过它们,如何接收它们?
2021-03-22 10:21:31
@RichieHindle 同样,如果您没有在var foo发布时添加和保留函数声明foo = function (){},则该变量foo将具有全局范围分配给它。您可以通过console.log(window.foo);在函数加载后执行来简单地检查这一点
2021-04-02 10:21:31
@RichieHindle 请注意“您声明函数的方式”很重要,请参阅stackoverflow.com/questions/11819425/...
2021-04-07 10:21:31
@RichieHindle 感谢您的解决方案,它的工作原理;)
2021-04-07 10:21:31

您可以,但必须在ready()方法的范围内调用它们,否则在ready()方法退出时它们会失去作用域

例如,下面的代码将起作用:

$(document).ready(function(){
  function foo()
  {
    alert('Bar');
  }

  foo(); // still in the scope of the ready method
});
@James,从代码的角度来看,这不会更好,如果需要从就绪范围的内部和外部调用它,请将您的 foo() 函数视为库或 API。在这种情况下,你让它接受所有必要的参数并输出一个结果,没有副作用。
2021-03-19 10:21:31
有什么办法可以解决这个问题吗?改变范围?
2021-04-03 10:21:31
@Oli,从代码组织的角度来看,能够在 .ready() 范围内声明它会更好。
2021-04-03 10:21:31
简单的。在 .ready(...) 范围之外定义它们。我不明白你为什么如此执着于这样做。它能给你带来什么好处?
2021-04-04 10:21:31

如果您将它们放在任何不属于它们的范围内,它们将显示为未定义。如果你真的想在 $(document).ready(...) 的范围之外使用它们,那么你需要在外部声明它们。如:

var foo;

$(document).ready(function(){
  foo = function()
  {
    alert('Bar');
  }
});

foo(); // works now because it is in scope

希望这可以帮助。

是的myfnc()调用是,但是myfnc(param1, param2)在输入 onclick 事件中呢?
2021-03-19 10:21:31
@jj_ Hari Om 的解决方案有效,因为对 myfnc 的调用在声明 myfnc 的同一范围内。
2021-03-25 10:21:31
因为 myfnc 实际上并不是函数的名字。Hari Om 创建一个匿名函数并将其分配给变量 myfnc。由于变量 myfnc 是全局变量(JScript 中的变量具有全局作用域,除非用“var”声明),因此它在 ready() 作用域之外可见。参见stackoverflow.com/questions/1013385/...了解函数声明和函数表达式之间的区别
2021-03-29 10:21:31

您的函数是在$(document).ready()回调范围内定义的,外部无法看到要么在调用范围之外定义函数,要么只从内部调用它。$(document).ready()

只是另一个补充:

在函数内部声明函数或变量$(document).ready()onclick(),在文档中使用绑定时这些是不可访问的。

您可以将声明移到 之外$(document).ready(),也可以$('#element').on('click', function() {})在`$(document).ready() 内使用。