这已经困扰了我几个小时了。我有一个文件,其中定义了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");
现在,我似乎在这段代码中看到没有任何问题,之前已经多次这样做了,所以有人可以指出我出了什么问题或者我在哪里愚蠢吗? 感谢
答案 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
试图从当前作用域中找不到的变量中获取其值,因此会抛出引用错误,因此会产生引用错误。
为了解决这个问题,最好有一些全球性的参考。