我正在尝试创建一个图像旋转器类,它循环遍历无序列表中的任意数量的图像。是否可以在类声明中定义递归函数? E.g:
var Rotator = Class.create() {
initialize: function() {
do something...
this.rotate();
}
rotate: function() {
do something...
this.rotate()
}
}
它当前抛出错误,指出“this.rotate()不是函数”
答案 0 :(得分:5)
你在那里应该工作(除了我认为的几个拼写错误;下面),因为你正在从属性访问该功能。请注意,这意味着如果您正在使用继承,则会重新输入最顶层(大多数子类)rotate
函数,因为这是分配给实例rotate
属性的那个。 / p>
你说这是this.rotate
不是函数。你怎么称呼它?因为如果你做的是这样的话:
var r = new Rotator();
setInterval(r.rotate, 1000);
或(rotate
内):
setInterval(this.rotate, 1000);
...这不会起作用,因为你只是将函数(而不是它的上下文)传递给setInterval
。这可行:
var r = new Rotator();
setInterval(r.rotate.bind(r), 1000);
或(rotate
内):
setInterval(this.rotate.bind(this), 1000);
使用Function#bind创建一个将设置正确上下文的函数。有关this post中Javascript中的函数与方法的更多信息。
var Rotator = Class.create() {
...
}
应该是
var Rotator = Class.create({
...
});
您还需要在您正在使用的对象文字符号中的两个函数之间使用逗号。所以那些清理过来的是:
var Rotator = Class.create({ // <= open brace *within* the parens
initialize: function() {
// do something...
this.rotate();
}, // <= missing comma was here
rotate: function() {
// do something...
this.rotate();
}
return pubs;
}); // <= close the braces and parens here
FWIW,您可以避免拼写错误,例如省略函数之间的逗号,也获得具有real names的函数的所有好处(而不是绑定到属性的匿名函数)< em> plus 获取私有类的功能(如果这对你有用)。这是我大多使用的成语(虽然我使用帮助器使语法更清晰;下面是原始Prototype):
var Rotator = Class.create((function(){
var pubs = {};
pubs.initialize = initialize;
function initialize() {
// do something...
this.rotate();
}
pubs.rotate = rotate;
function rotate() {
// do something...
this.rotate();
}
return pubs;
})());
有关该成语的更多信息(以及为何无法合并上述pubs
和function
链接)the linked post。
答案 1 :(得分:0)
是的,只要您确信“这个”是正确的,这是可能的。还有其他方法,但它们有不幸的缺点。您可以为函数指定名称(即,在function
关键字之后),但这可能会导致IE出现问题。你也可以通过arguments.callee
来引用一个函数,但是我已经知道这有很奇怪的性能问题,加上整个arguments
的东西都有点被弃用了,因为它很奇怪。