Javascript没有定义thnk'class'对象

时间:2015-01-14 21:58:17

标签: javascript jquery class object

这已经困扰了我几个小时了。我有一个文件,其中定义了Javascript类对象,然后在定义之后立即实例化clas。我得到一个未定义的错误,好像该类没有定义,当它非常清楚:

(function($) {
function NewsSlider(element, children) {
    this.element = element;
    this.children = children;   
    this.currentItem  = 0;
    this.maxCount = this.children.length;
}

NewsSlider.prototype.displayItem = function() {
    this.children.hide();
    this.children[this.currentItem].show();
}

NewsSlider.prototype.startNewSlider = function() {
    if(this.currentItem > this.maxCount) {
        this.currentItem = 0;
    }
    setTimeout(function() {
        this.displayItem();
    }, 5000);
}
})(jQuery);

var a = new NewsSlider();

以下是我遇到的错误:

ReferenceError: NewsSlider is not defined   

var newsSliders = new NewsSlider("#news-ticker ul", "#news-ticker ul li");

现在,我似乎在这段代码中看到没有任何问题,之前已经多次这样做了,所以有人可以指出我出了什么问题或者我在哪里愚蠢吗? 感谢

3 个答案:

答案 0 :(得分:4)

您已在另一个函数中声明NewsSlider,因此它的作用域是该函数。

您正试图在不存在的函数之外使用它。

function NewsSlider(element, children) { ... }移到匿名函数之外,或在其中移动var a = new NewsSlider();

由于您不使用jQuery或创建除NewsSlider以外的任何顶级范围变量,您也可以完全使用匿名函数。

答案 1 :(得分:2)

这是范围错误,是将代码置于闭包中的结果。这实际上是闭包的一个特征,正是为什么你应该使用它们。因此,您可以访问其中定义的变量。这是为了防止污染全局命名空间。

您可以在闭包之外定义NewsSlider,您可以从闭包中返回NewsSlider并将其分配给新的var,或者您可以一起消除闭包。

选项1:

var NewsSlider;

(function($) {
NewsSlider = function(element, children) {
    this.element = element;
    this.children = children;   
    this.currentItem  = 0;
    this.maxCount = this.children.length;
}
})(jQuery);

var a = new NewsSlider();

选项2:

var NewsSlider = (function($) {
    var NewsSlider = function(element, children) {
        this.element = element;
        this.children = children;   
        this.currentItem  = 0;
        this.maxCount = this.children.length;
    }
    return NewsSlider;
})(jQuery);

var a = new NewsSlider();

选项3:

function NewsSlider(element, children) {
    this.element = element;
    this.children = children;   
    this.currentItem  = 0;
    this.maxCount = this.children.length;
}

var a = new NewsSlider();

答案 2 :(得分:0)

如果没有关于现有对象的线索,你不能指望它“认为”已经定义了类。

你已经在一个闭包中定义了你的类,因此一旦你离开了该函数的范围,jQuery就会不再引用它,因此你会得到一个引用错误。

考虑:

--> function()
|   {
|       class aClass definition here
|
|       a = new aClass;
|
|       // do some work with the class here.
|
--> } 

这里的所有内容都很好,因为在当前范围内可以访问类,但是请考虑下面的第二个示例,我们尝试将值赋给p,超出包含类定义的函数的范围: / p>

--> function()
|   {
|       class aClass definition here
|
|       a = new aClass;
|
|       // do some work with the class here.
|
--> } 

var p = a.getParam();

由于p试图从当前作用域中找不到的变量中获取其值,因此会抛出引用错误,因此会产生引用错误。

为了解决这个问题,最好有一些全球性的参考。