为什么我会出现JavaScript引用错误?

3
我做错了什么?我尝试创建对象,但当我尝试初始化时,控制台会出现此错误。我尝试将所有代码放在document.ready中和不放在其中都不起作用。在这两种情况下,我都遇到了一些错误。作为新手,对不起,这可能是一个愚蠢的问题。
ReferenceError: Circle is not defined
    var obj = new Circle;

JS

$(function(){
        var Circle = {

                init: function() {
                    console.log("Circle initialized");
                }     
        };

});

HTML

<!DOCTYPE html>
<html>
    <head>

        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
        <script src="javascript/circle.js"></script>

        <script>           

               $(document).ready(function(){
                   var obj = new Circle;

                   obj.init();
               })

        </script>

    </head>
    <body>
        <div id="test" >TODO write content</div>
    </body>
</html>

最新更新

$(function(){

        window.Circle = {

                init: function() {
                    console.log("Circle initialized");
                }     
        };
       window.Circle.init();
});

....

  <head>

     <script>           

        window.Circle().init();

    </script>

</head>
2个回答

9

您已经在另一个函数中定义了“Circle”函数——作为“ready”处理程序传递的匿名函数。因此,该符号(“Circle”)对该函数是私有的,而对其他代码不可见。

您可以通过以下方式将其设为全局变量:

window.Circle = {
  // ...
};

你还可以将其添加到jQuery命名空间中(可能合适,也可能不合适;这取决于你正在做什么),或者为应用程序代码开发自己的命名空间。或者,最后,你可以考虑将你的jQuery“ready”代码组合起来,以便“Circle”对象和使用它的代码都出现在同一个处理程序中。

编辑 - 另外一种可能性是完全将你的“Circle”声明移出“ready”处理程序。如果你所做的只是初始化该对象,并且你的属性值不需要使用DOM或其他尚不可用的资源进行任何工作,那么你可以摆脱$(function() { ... })包装器。


谢谢您的回答。但是当我定义窗口时,我又遇到了TypeError: window.Circle未定义的问题。 - Jony
@Jony,可能是因为你在“circle.js”中的处理程序在另一个处理程序之后被调用了,但我不确定原因。如果你只是定义了“Circle”对象,那么代码实际上根本不需要在“ready”处理程序中。我会扩展我的答案。 - Pointy
只需要几秒钟就可以再次尝试您所说的一切。 - Jony
@Jony 嘿,抱歉,我错过了你的另一个错误 - "Circle" 不是函数,它只是一个对象。你的其他代码试图使用 new 将其作为函数调用。你只能在函数上使用 new - Pointy
我发现了一个问题。我将对象声明放在<head>标签中并初始化它。当声明在Head标签中时,一切都很好。但是,当我将对象声明移动到其他test.js文件中时,它就不起作用了。 - Jony
显示剩余4条评论

1

1) 你正在将Circle分配在函数上下文中,而不是作为全局变量。除非将其暴露给全局变量,否则只能在该函数中使用。 2) 你正在将Circle作为构造函数调用,但Circle不是一个函数。

以下解决了这两个问题:

var Circle = function () {};
Circle.prototype.init = function () {
    console.log('Circle initialized.');
};
var obj = new Circle();
obj.init();

哇,我完全错过了这个!好眼力。 - Pointy
是的,我知道。我把Object Circle放在了单独的文件中,在head标签中放置了对象实例,但我又遇到了愚蠢的错误。 - Jony
在你的新代码中:window.Circle().init();-- window.Circle 不是一个函数,你只能使用 window.Circle.init() - user1994380

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接