【发布时间】:2010-11-06 13:07:00
【问题描述】:
如果我将它们放在 document.ready() 函数中,函数就会出现未定义:
$(document).ready(function(){
function foo()
{
alert('Bar');
}
});
foo(); // Undefined
为什么会这样?我确定我只是需要一些简单的理解:)
【问题讨论】:
标签: javascript jquery
如果我将它们放在 document.ready() 函数中,函数就会出现未定义:
$(document).ready(function(){
function foo()
{
alert('Bar');
}
});
foo(); // Undefined
为什么会这样?我确定我只是需要一些简单的理解:)
【问题讨论】:
标签: javascript jquery
不确定为什么在 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>
显然您不能在ready() 之后立即从内联脚本调用foo(),因为ready() 代码尚未运行,但您可以稍后调用该函数。
只需确保在ready() 代码运行之前没有任何东西可以尝试调用foo()(或将foo() 的初始声明设为无害函数)。
【讨论】:
foo()并带一些参数怎么办?你将如何传递它们,它们将如何被接收?
foo = function(x, y, z) {...} ... onclick="foo(1, 2, 3)"
var foo 并在发布 foo = function (){} 时保留函数声明,则变量 foo 将具有分配给它的全局范围。您可以在函数加载后通过console.log(window.foo); 简单地检查这一点。
您可以,但必须在 ready() 方法的范围内调用它们,否则它们会在 ready() 方法退出时失去范围。
例如,下面的代码将起作用:
$(document).ready(function(){
function foo()
{
alert('Bar');
}
foo(); // still in the scope of the ready method
});
【讨论】:
如果您将它们放在任何不属于它们的范围内,它们将显示为未定义。如果您真的想在 $(document).ready(...) 范围之外使用它们,那么您需要在外部声明它们。如:
var foo;
$(document).ready(function(){
foo = function()
{
alert('Bar');
}
});
foo(); // works now because it is in scope
希望这会有所帮助。
【讨论】:
myfnc() 调用是,但是在输入 onclick 事件中 myfnc(param1, param2) 呢?
您的函数是在$(document).ready() 回调范围内定义的,并且无法从外部看到。要么在$(document).ready() 范围之外定义函数,要么只从内部调用它。
【讨论】:
只是另一个补充:
在$(document).ready() 函数内声明函数或变量时,在文档中使用onclick() 绑定时这些是不可访问的。
您可以将声明移到$(document).ready() 之外,也可以在`$(document).ready() 中使用$('#element').on('click', function() {})。
【讨论】:
<script>
$(document).ready(function(){
myfnc = function (param1, param2)
{
alert('Hello');
}
myfnc();
});
</script>
<input type="button" onclick="myfnc('arg1', 'arg2')" value="Click me">
【讨论】: