2012-03-23 167 views
1

林调用一个for循环内的循环,它不工作,下面的代码:嵌套循环不工作

function PopulateMonths() { 
for (var m = 0; m < 12; m++) { 
    var $month = $('.d-month').clone(); 
    $month.find('.d-header').text(m); 
    $month = PopulateDays($month); 
    $month.appendTo('#diary').show(); 
    $month = null; 
} 
} 

function PopulateDays($month) { 
for (var d = 0; d < 30; d++) { 
    var $row = $('.d-row').clone(); 
    $row.find('.d-day').text(d); 
    $row.appendTo($month).show(); 
    $row = null; 
} 
return $month; 
} 

如果我打电话PopulateDays手动12倍早点工作正常,如我尝试使用PopulateMonths()循环12次页面崩溃,CPU使用率通过屋顶,所以我承担了大量的工作。

我错过了什么?

回答

3

我以前不得不解决一个非常类似的问题。这是因为当你克隆元素时,你也在克隆他们的类等。然后你将克隆的项插入到文档中。

下次尝试查找具有该类的元素时,它会找到两个实例 - 原始实例和上一步中克隆的实例。两者都将被克隆,现在你在页面上有4个元素。因此,基本上每次迭代中的元素数量加倍,并且在几天内执行12次,而在几个月内执行的次数为30次。

 
2^12 = 4096 
2^30 = 1,073,741,824 

这些只是粗略估计它可以增长多大。我没有做任何进一步的分析来找到确切的数字,但基本上指数增长正在吃掉CPU并导致浏览器崩溃。

+0

我明白你的意思了,所以我需要对我的选择更加具体,让我的头脑变得圆满。谢谢 – LenPopLilly 2012-03-23 00:52:25

+0

是的,要么是更具体的,要么从您选择的克隆元素中删除该类。 – Anurag 2012-03-23 00:58:41

+0

现货,再次感谢。 – LenPopLilly 2012-03-23 01:00:18

0

我相信,因为你是克隆组一个月的元素在这条线:

var $month = $('.d-month').clone(); 

,然后在填入天的功能在此行追加30行到一个月:

$row.appendTo($month).show(); 

然后在该行中追加月份到日记中:

$month.appendTo('#diary').show(); 

然后下一次这个lin Ë执行还有一个月,它们会在这一行克隆:

var $month = $('.d-month').clone(); 

除了在这一行再克隆刚刚追加了行:

var $row = $('.d-row').clone(); 

在一个循环中执行这增加了负荷基本上。