未捕获的ReferenceError:未定义foobar(匿名函数)

时间:2011-12-19 22:19:46

标签: javascript jquery ajax

我从某个域提供此js文件说foobar.com

at http://foobar.com/static/js/main.js:

$(document).ready(function() {
        function foobar(bar){
            $.ajax({
                    url: "/site/foo/",
                data: {'foo':bar},
                    dataType: "jsonp",
                    crossdomain: !0,
                    success: function (data) {
                alert(data);
                    },
                    error: function () {
                    }
                })
        }   
    });

在某个网址的barfoo.com上,我有类似的内容:

<script src='http://foobar.com/static/js/main.js' type='text/javascript'></script>
<script type='text/javascript'>foobar('123456')</script>

当我点击该网址时:它说

Uncaught ReferenceError:foobar is not defined (anonymous function)

如何从其他域访问功能?

2 个答案:

答案 0 :(得分:11)

您已定义&#34; foobar()&#34;在&#34;准备好&#34;处理程序。因此,它是该函数中的局部变量,在其外部是不可见的。

您可以将其添加到&#34; ready&#34;的末尾。处理程序:

  window['foobar'] = foobar;

然后它在全球范围内可见。

顺便说一下,这可以咬jsfiddle,因为它(默认情况下)会将代码包装在&#34; load&#34;处理程序。因此,如果您从<head>中包含的JavaScript文件进行复制/粘贴,那么在该上下文中将是全局的函数最终在小提琴中不是全局的。

答案 1 :(得分:0)

Pointy指出,您的功能在全球范围内不可见。但是您也在加载脚本并调用ready()函数定义的函数。我想当你的脚本调用ready()会产生同样的错误时,可能没有调用foobar()。我建议你在脚本中设置一个全局值,然后在ready()函数中使用该变量。

在脚本中设置值:

<script src='http://foobar.com/static/js/main.js' type='text/javascript'></script>
<script type='text/javascript'>var bar = '123456'</script>

然后您可以在ready()函数中使用它。

$(document).ready(function() {
        $.ajax({
                url: "/site/foo/",
                data: {'foo':bar},
                dataType: "jsonp",
                crossdomain: !0,
                success: function (data) {
                   alert(data);
                },
                error: function () {
                }
            });  
       });

如果你想定义一个函数以便再次使用它,你可以在ready()中调用它,但要确保将全局变量bar设置为你想要的。

window.foobar = function() {
        $.ajax({
                url: "/site/foo/",
                data: {'foo':bar},
                dataType: "jsonp",
                crossdomain: !0,
                success: function (data) {
                   alert(data);
                },
                error: function () {
                }
            });
       }

$(document).ready(function() {
    foobar();
    // other stuff 
});