1

因为如果我想要参数,我需要传递一个匿名函数setInterval,我尝试使用下面的代码。最初我有它调用this.countUp,但是当它返回时,NaN我做了一些阅读并.call(this)在 SO 上找到了解决方案。但是,当我将它与匿名函数(我承认我对此有点模糊)结合起来时,我现在进入TypeError: this.countUp is undefined了 Firebug。

我想我不需要使count可访问,也不需要playBeep方法,但让我们假装我想要这样我就可以理解我对这段代码做错了什么。

    function workout() {
        var beep = new Audio("beep1.wav");
        this.timerWorkout; //three timers in object scope so I can clear later from a different method
        this.timerCounter; 
        this.timerCoolDown;
        this.count = 0;

        this.startWorkout = function() {
            alert(this.count);
            this.timerWorkout = setTimeout(this.playBeep, 30 * 1000); //workout beep - 30 seconds
            this.timerCounter = setInterval(function() {this.countUp.call(this)}, 1000); //on screen timer - every second

        }

        this.startCoolDown = function() {
            this.timerCoolDown = setTimeout(this.playBeep, 10 * 1000); //cooldown beep - 10 seconds
        }

        this.playBeep = function() {
            beep.play(); //plays beep WAV
        }

        this.countUp = function() {
            this.count++;
            document.getElementById("counter").innerHTML = this.count; 
        }

    }

    var workout1 = new workout()
4

3 回答 3

5

内部startWorkout使用bind(this)

this.timerCounter = setInterval(function() {this.countUp()}.bind(this), 1000);
于 2013-05-17T14:03:09.667 回答
2

发生的事情是 setInterval 正在改变this你提供给它调用的函数内部的值。您需要存储this在一个单独的变量中以防止它被覆盖。

function workout() {
    var self = this;
    // ...

     this.startWorkout = function() {
            alert(this.count);
            this.timerWorkout = setTimeout(self.playBeep, 30 * 1000); // this method works
            this.timerCounter = setInterval(function() {self.countUp}, 1000); // so does this one
     }
}
于 2013-05-17T13:54:23.517 回答
0

js中变量作用域受限于功能的原因。因此,当您尝试this在嵌套函数中使用时,您会获得指向另一个对象的链接。在更高级别的函数中创建一个变量var that = this;,然后在任何可以将您引用到正确上下文的嵌套函数中使用它。

于 2013-05-17T13:59:12.303 回答