2

我无法弄清楚这段代码有什么问题。Firefox 的错误控制台告诉我:“ this.animateImgSlider 不是函数”。

我想要的是调用this.selectImage()jsItems[0].selectImage(0)然后this.animateImgSlider()被调用多次,直到selfCall为假:

function WindowItem(inId) {
    this.id = inId;
    this.imgSliderTarget = 0;
    this.imgSlider = document.getElementById("imgSlider"+inId);

    this.animateImgSlider = function() {
        var selfCall = true;
        var currLeft = parseInt(this.imgSlider.style.left, 10);
        if (currLeft < this.imgSliderTarget) {
            currLeft += 8;
            if (currLeft >= this.imgSliderTarget) {
                currLeft = this.imgSliderTarget;
                selfCall = false;
            }
        }
        else {
            currLeft -= 8;
            if (currLeft <= this.imgSliderTarget) {
                currLeft = this.imgSliderTarget;
                selfCall = false;
            }
        }
        this.imgSlider.style.left = currLeft+"px";
        if (selfCall) setTimeout("this.animateImgSlider()", 0);
    }

    this.selectImage = function(inImg) {
        this.imgSliderTarget = -inImg*488;
        this.animateImgSlider();
    }
}
var jsItems = new Array();
jsItems.push(new WindowItem(0));

这一行是引发错误的行:

if (selfCall) setTimeout("this.animateImgSlider()", 0);
4

2 回答 2

5

改用这个:

if (selfCall) {
    var self = this;
    setTimeout(function () {
        self.animateImgSlider();
    }, 0);
}

self(当然,对我来说,在顶部声明并在整个函数中使用它而不是更有意义this

传递给setTimeout执行的字符串是在全局范围内完成的,意思this是指window. 它不在setTimeout调用所在的当前范围内执行。

附带说明一下,作为建议,我会将您的方法animateImgSliderselectImage方法移到WindowItem原型之外,以便所有实例都可以共享它们,而不是每次都创建一个新的匿名函数。因此,例如,您将拥有:

function WindowItem(inId) {
    // blah blah
}

WindowItem.prototype.animateImgSlider = function () {
    // blah blah
};

WindowItem.prototype.selectImage = function(inImg) {
    // blah blah
};

的值this仍将引用特定实例,除非您尝试在字符串中使用它作为setTimeout参数:)

这显然不是必需的,因为您的代码当前可以正常工作,但它是在构造函数上声明方法以供实例共享的常用约定。

于 2013-04-14T03:24:14.490 回答
2

您可以使用绑定。这里是链接

if (selfCall) {
    setTimeout(function () {
        this.animateImgSlider();
    }.bind(this), 0);
}
于 2013-04-14T03:26:03.267 回答