2014-09-28 134 views
5

我决定搞乱jquery,制作一个简单的基于轴测图的游戏。它呈现一些地图,然后在堆栈中出现问题。 (超过最大调用堆栈大小) 我现在只是使用背景颜色作为瓷砖。为什么这个循环会导致堆栈溢出?

JS Bin Here

var map = [ 
    "g","g","g","s","s", 
    "g","g","s","s","w", 
    "g","g","s","w","w", 
    "g","g","s","w","w", 
    "g","g","s","w","w" 
]; 
var x = 0; 
var y = 0; 
var count = 0; 
var background; 
function init() { $.each(map, function(key, value) { 

    x += 30; 
    y += 60; 
    if (count > 4){ 
    x -= 120; 
    y -= 360; 
    count = 0; 
    } 
    if (value == "g"){background = "#00ff00";} 
    if (value == "w"){background = "#0000ff";} 
    if (value == "s"){background = "#ffff00";} 

    $('.map_piece').clone().appendTo('body').css({'top' : x + 'px', 'left' : y + 'px','display' : 'block','background' : background}); 
     count ++; 
}); 
       } 

$('document').ready(function(){ 
init(); 

}); 

回答

5

在每次迭代k中,您会克隆2^k个项目。

相反克隆的元素,它可能只是更容易在每次创建新的元素:

$('<div class="map_piece">') 
    .appendTo('body') 
    .css({'top' : x + 'px', 'left' : y + 'px','display' : 'block','background' : background}); 
+0

非常感谢您的纠正和原因。我对克隆不太熟悉,我没有意识到我克隆了每一个实例。这两个答案都很有帮助,但是由于你先回答2分钟......你会得到复选标记! :) – 2014-09-28 04:49:55

4

调用$('.map_piece').clone()克隆已创建迄今所有作品。每次循环运行时,这会导致克隆元素数量呈指数级增长。要执行您打算执行的操作,请使用first()将克隆限制为仅一个元素。

$('.map_piece').first().clone().appendTo('body').css({'top' : x + 'px', 'left' : y + 'px','display' : 'block','background' : background}); 
+0

最多的一票!感谢您向我展示first()!我看到了两种方法,并会尝试记住它们。 – 2014-09-28 04:50:50