为什么这个循环会导致堆栈溢出?
问题描述:
我决定搞乱jquery,制作一个简单的基于轴测图的游戏。它呈现一些地图,然后在堆栈中出现问题。 (超过最大调用堆栈大小) 我现在只是使用背景颜色作为瓷砖。为什么这个循环会导致堆栈溢出?
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();
});
答
在每次迭代k中,您会克隆2^k个项目。
相反克隆的元素,它可能只是更容易在每次创建新的元素:
$('<div class="map_piece">')
.appendTo('body')
.css({'top' : x + 'px', 'left' : y + 'px','display' : 'block','background' : background});
答
调用$('.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
非常感谢您的纠正和原因。我对克隆不太熟悉,我没有意识到我克隆了每一个实例。这两个答案都很有帮助,但是由于你先回答2分钟......你会得到复选标记! :) – 2014-09-28 04:49:55