0

喂!满足条件时,我的函数没有返回(退出)。

var arrowReady = false;
var arrowImage = new Image();
var deg = 0;
arrowImage.onload = function () {
    arrowReady = true;
    function moveArrow() {
        setInterval(function() {
            ctx1.save();
            deg++;
            ctx1.rotate(deg * Math.PI / 180);
            // Here is  ^  the amount of degrees it turns.
            ctx1.clearRect(300, 200, 52, 310);
            ctx1.drawImage(arrowImage, 300, 100, 42, 300);
            ctx1.restore();
        }, 100);

        if (deg == 40) return;

    }
}

据我了解,当 deg = 40 时,该功能应该停止。但是,事实并非如此。有什么建议么?

4

3 回答 3

2

棘手的 javascript 在这里进行。moveArrow仅在文档加载时调用一次。是否返回不会阻止您的间隔运行。

您需要保存对间隔的引用:

var interval = setInterval(...

然后在匿名setInterval函数内,当deg ==40你想要clearInterval(interval)阻止它运行时。

尝试这个:

var arrowReady = false;
var arrowImage = new Image();
var deg = 0;
arrowImage.onload = function () {
    arrowReady = true;
    function moveArrow() {
        var interval = setInterval(function() {
            if (deg == 40) {
              clearInterval(interval);
              return;
            }
            ctx1.save();
            deg++;
            ctx1.rotate(deg * Math.PI / 180);
            // Here is  ^  the amount of degrees it turns.
            ctx1.clearRect(300, 200, 52, 310);
            ctx1.drawImage(arrowImage, 300, 100, 42, 300);
            ctx1.restore();
        }, 100);

    }
}
于 2013-04-17T16:56:18.230 回答
0

我不是 JavaScript 程序员,但您不需要指定要返回的值吗

例子if (deg == 40) return deg;

于 2013-04-17T16:55:52.340 回答
0

目前尚不清楚最后一个条件甚至应该做什么。它之后什么都没有,所以函数无论如何都会在那里停止执行。deg == 40无论如何,如果这是函数调用结束的地方,这有什么关系呢?

我敢肯定,更重要的是,所讨论的函数实际上并没有改变. deg所以在那条线上deg永远不会相等。40您正在做的是排队另一个函数以在以后运行(100 毫秒?)。在该函数排队后,控件立即转到该if语句(在其他函数运行之前)。

因此,在语句执行deg后,在完全不同的函数范围内进行修改。if

于 2013-04-17T16:57:11.200 回答