InternalError:递归太多

时间:2011-11-26 21:18:11

标签: javascript javascript-1.8

我正在制作一个简单的JavaScript Life实现来试验JavaScript 1.8的新功能,并且我使用此代码得到了“InternalError:太多的递归”,并且世界大小为300×300:

function LifeWorld(hDim, vDim) {
    var data = let(that = this) Array.make(hDim, function(x) Array.make(vDim, function(y) new LifeCell(that, x, y)));

    this.item = function(x, y) {
        return (data[x] && data[x][y]) || null;
    };

    this.draw = function(g) {
        g.fillRect(0, 0, this.scale, this.scale);
    };

    this.scale = 5;
    this.offsetX = 0;
    this.offsetY = 0;

    // Finally, initialize all the cells and let them recognize their neighbours:
    try {
        for(let i = 0; i < ARRAY_SIZE * ARRAY_SIZE; i++) {
            this.item(i / ARRAY_SIZE | 0, i % ARRAY_SIZE).init();
        }
    } catch(e) {
        alert(e);
    }
}

function LifeCell(world, x, y) {
    var ul, u, ur,
        l,      r,
        bl, b, br;

    Object.defineProperties(this, {
        world: {
            get: function() {
                return this.world;
            }
        },
        x: {
            get: function() {
                return this.x;
            }
        },
        y: {
            get: function() {
                return this.y;
            }
        }
    });

    this.init = function() {
        alert('Init ' + x + ', ' + y);
        [ul, u, ur,
         l,      r,
         bl, b, br] = [world.item(this.x - 1, this.y - 1), world.item(this.x, this.y - 1), world.item(this.x + 1, this.y - 1),
                       world.item(this.x - 1, this.y),     world.item(this.x, this.y),     world.item(this.x + 1, this.y),
                       world.item(this.x - 1, this.y + 1), world.item(this.x, this.y + 1), world.item(this.x + 1, this.y + 1)];
        delete this.init;
    };
}

我收到一个警报“Init 0,0”,所以在初始化之前的所有内容都能正常工作,但之后我收到了异常消息。看起来它必须与world.item有关,但我不知道 - world.item只会返回一些内容。

我也无法使用Firebug进行调试,因为这段代码显然会让Firefox崩溃。谁能弄清楚这里出了什么问题?

1 个答案:

答案 0 :(得分:10)

你的递归来自这段代码:

x: {
    get: function() {
        return this.x;
    }
},

你将返回getter本身,它将返回getter本身等,这会导致无休止的递归。所有的吸气者似乎都是如此。出于这个原因,放弃吸气剂的想法可能会更好,因为它们可能会导致像这样的挫败感。

http://jsfiddle.net/8hVwb/