javascript - 为什么这个递归函数会给我一个 "Maximum call stack size exceeded"错误?

标签 javascript jquery html canvas

我正在使用 HTML Canvas 创建一个绘画应用程序,我正在尝试实现一个“油漆桶”工具,该工具会检测与被点击像素颜色相同的任何相邻像素,并用新的颜色填充它颜色。

我收到“Uncaught RangeError: Maximum call stack size exceeded”,但我无法弄清楚我的逻辑出了什么问题:

function fillTool(){
    theCanvas.mousedown(function(e){
        var baseColor = paintUtilities.getPixelColor(e.offsetX, e.offsetY);
        context.fillStyle = color;
        fillNeighbors(e.offsetX, e.offsetY, baseColor);
    });
}

function fillNeighbors(x, y, baseColor) {
    context.fillRect(x, y, 1, 1);
    if (x > 0 && paintUtilities.getPixelColor(x - 1, y) === baseColor) {
        fillNeighbors(x - 1, y, baseColor);
    }
    if (y > 0 && paintUtilities.getPixelColor(x, y - 1) === baseColor) {
        fillNeighbors(x, y - 1, baseColor);
    }
    if (x < theCanvas.attr("width") - 1 && paintUtilities.getPixelColor(x + 1, y) === baseColor) {
        fillNeighbors(x + 1, y, baseColor);
    }   
    if (y < theCanvas.attr("height") - 1 && paintUtilities.getPixelColor(x, y + 1) === baseColor) {
        fillNeighbors(x, y + 1, baseColor);
    }   

}

最佳答案

实际上再看一眼,我发现你的代码有问题,它确实有无限递归!

假设您从 x = 1 开始,x 可以从 0 到 2。您首先向左移动,然后递归调用该函数。该功能最终将向右移动!然后这个循环将永远重复。您需要跟踪您访问过的位置,或者向递归函数传递一个不继续的方向,或者类似的东西。

关于javascript - 为什么这个递归函数会给我一个 "Maximum call stack size exceeded"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23689371/

相关文章:

javascript - 使用 jeditable 并获取 TypeError : $(. ..).editable 不是函数,该怎么办?

javascript - 使用 $.grep 过滤数组对象失败

javascript - Fullcalendar 在侧边栏中返回无效日期

html - 如何正确决定 Angular 2 中的组件应该是什么?

html - 将内联 block div 与内联 block 兄弟居中对齐

javascript - Jquery 在滚动时触发动画一次

javascript - 删除字符串中倒数第二个正斜杠之后的数据

javascript - 'props' 被分配了一个值但从未使用过 no-unused-vars vue3

javascript - Bootstrap 轮播 : Make download next image when using background-image on div instead of img

jquery - 将服务器端数据从 ejs 传递到 Ajax