2011-05-25 33 views
2

这里是我的HTML/JavaScript的:为什么在调用document.ready()时声明的函数没有定义?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Untitled Document</title> 
    <script type="text/javascript" src="/script/jquery.js"></script> 
    <script type="text/javascript"> 
     $(function(){ 
      var $str = "hello world"; 

      function foo() { 
       alert($str); 
      } 
     }); 
    </script> 
</head> 
<body> 
    <form name="statusUpdateForm" method="post"> 
     <input type="button" name="submitButton" value=" " onclick="foo();" /> 
    </form> 
</body> 
</html> 

当我按一下按钮,我得到一个JavaScript错误,指出FOO没有被定义。我如何调用在document.ready()中声明的JavaScript函数?

+0

相关问题在这里。http://stackoverflow.com/questions/1055767/why-can-i- not-define-functions-in-jquerys-document-ready – c4il 2011-05-25 19:28:20

回答

7

基本上,您将函数的作用域放在另一个函数中。

拍下这一刻:

<script> 
    document.onload = function(){ 
    function foo(){ 
     alert('bar'); 
    } 
    }; 
    foo(); 
</script> 

这是你要完成的传真。就像函数中定义的变量不受其限制,函数名称具有相同的特征。

Side-Note对于变量名,JavaScript不需要$前缀(尽管就名称而言是可以接受的)。我不知道你是否来自PHP,只是习惯或意识到。

想到我会让我的评论一个答案。

+0

谢谢。我现在感到很蠢。 – 2011-05-28 03:13:39

0

你不能,它是私人的范围。

+0

也可以,你只需要复制乐趣超出范围。如果你做一些像this.foo = foo,或者window ['foo'] = foo,或者类似的东西,代码就可以工作。这通常也是你想要的。尽管我建议使用'$('input [type = button]')。click(foo);'在ready函数中。 – Alxandr 2011-05-25 19:15:35

+0

我同意你的建议,但如果你考虑这个问题,我的答案仍然是正确的。您可以通过将全局范围变量指向它们来公开私有范围内的内容,但仍然无法访问它们。这不是一个“抱歉不能帮助你”的答案,它是为了教育范围规则。 – Milimetric 2011-05-25 19:19:14

1

试试这个:

$(function() { 
    window.foo = function() { 
     alert('bar'); 
    } 
}); 

基本上,你需要公开的功能全局范围。

0

我最终什么事做 - 我应该首先做了 - 是增加点击处理程序提交按钮:

$("input[name='submitButton']").click(function(){...}); 
1

变量和方法$(函数()函数内声明的是如果你需要在外面使用,你可以在全局命名空间中使用它,如

window.functionName = functionName; 
相关问题