非法使用break语句;JavaScript

55
当这个变量达到一定数量时,我希望循环停止,但我一直收到错误提示:“Uncaught SyntaxError: Illegal break statement”。
function loop() {
    if (isPlaying) {
        jet1.draw();
        drawAllEnemies();
        requestAnimFrame(loop);
        if (game==1) {

            break;

        }

    }
} 

5
break 用于跳出循环。在你的代码中,没有循环。 - tymeJV
@Hogan 这是一个自我调度的功能。 - sabof
第一个if语句:if (isPlaying && game != 1) - Bart
5个回答

85

break是用于跳出类似于for、while、switch等循环结构的语句块,但在这里你无法使用它。你需要使用return来中止当前函数的执行流程并返回给调用者。

function loop() {
    if (isPlaying) {
        jet1.draw();
        drawAllEnemies();
        requestAnimFrame(loop);
        if (game == 1) {
           return
        }
    }
}

注意:这并不涵盖if条件的逻辑或何时从方法返回,为此我们需要更多关于drawAllEnemiesrequestAnimFrame方法以及如何更新game值的上下文。


1
哦,我是新手,但非常感谢你的帮助! - lehermj
实际上根本没有退出循环。无论game的值如何,requestAnimFrame都将被调用,导致loop永远运行。 - Bart
这将取决于requestAnimFrame的实现方式以及回调函数loop的调用方式...如果回调函数有条件调用,它将退出。 - Arun P Johny
2
requestAnimFrame 很可能只是 requestAnimationFrame 的别名。换句话说:如果你调用了一次 looprequestAnimFrame 将确保另一个对 loop 的调用将被执行,而不管 game 的值如何。当前的答案是错误的。 - Bart

7

在 game == 1 的情况下,你需要确保 requestAnimFrame 不再被调用。一个 break 语句只能退出传统的循环(例如 while())。

function loop() {
    if (isPlaying) {
        jet1.draw();
        drawAllEnemies();
        if (game != 1) {
            requestAnimFrame(loop);
        }
    }
}

另外一个选择是,你可以仅仅跳过第二个 if 条件,并将第一个条件改为 if (isPlaying && game !== 1)。你需要创建一个名为 game 的变量并赋值为 0。每一次游戏都要将其加 1。


0

我有一个函数next(),也许会给你一些启发。

function queue(target) {
        var array = Array.prototype;

        var queueing = [];

        target.queue = queue;
        target.queued = queued;

        return target;

        function queued(action) {
            return function () {
                var self = this;
                var args = arguments;

                queue(function (next) {
                    action.apply(self, array.concat.apply(next, args));
                });
            };
        }

        function queue(action) {
            if (!action) {
                return;
            }

            queueing.push(action);

            if (queueing.length === 1) {
                next();
            }
        }

        function next() {
            queueing[0](function (err) {
                if (err) {
                    throw err;
                }

                queueing = queueing.slice(1);

                if (queueing.length) {
                    next();
                }
            });
        }
    }

0

在forEach循环中不能使用break语句,你可以用for循环替代它


0

你也可以做那些事情,

const re =  winState.map(elements => {
    let a = gameState[elements[0]];
    let b = gameState[elements[1]];
    let c = gameState[elements[2]];

如果你想在这个循环中退出,只需
返回整个函数
if (a === b && b === c) {
         return re;
    }
}

当这个条件为真时,你退出这个循环


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接