2014-05-02 18 views
0

我有一段代码,导致某种内存泄漏。经过数小时的测试后,我设法将其追踪到elem2.is(":visible");减慢javaScript。错误。 jQuery.is(“:visible”)

我如何跟踪它 - >我的代码在延迟1秒后自行循环。我将这个延迟设置为0,并保存了10次迭代所需的平均时间。我结束了一个整数列表,如下所示。

这里是我的“速度测试”没有任何memoryLeaks等:

"4128 , 3964 , 4054 , 3994 , 3946 , 4011 , 4117 , 4044 , 4036 , 3945 , 4031 , 3859 , 4015 , 4019" 

我只包括第一位的查看结果。但你可以看到平均需要4000毫秒才能完成十次循环。当我包括elem2.is(":visible");

5128 , 4967 , 4975 , 5085 , 5127 , 5261 , 5550 , 5804 , 6160 , 6395 , 6617 , 7056 , 7658 , 8191 , 8492 , 9038 , 9364 , 10242 , 10893 

正如你可以看到做循环增加“X”量成倍所花费的时间

下一页这里的值。

下面是代码:

function foo() { 
    var elem1 = $("#A"), 
     elem2 = $("#B"); 

    if(elem1.length && elem2.length && elem2.is(":visible")) { 
     // Do stuff 
    } 
} 

有谁知道任何知道这个功能的问题?无论如何,以避免它放慢我的功能? (我最想知道为什么它也这样做)。

感谢

+0

注意:我设法消除了这个错误。使用'elem2.css(“隐藏”)!==“无”来检查。仍然非常好奇为什么会出现这个错误。 – User2

+0

注意:我应该提到这个错误只会发生,如果你喜欢'for(var i = 0; i <1000; i ++){foo();}'。 – User2

+0

注意:最后我使用了'elem [0] .offsetHeight && elem [0] .offsetWidth'。如果其中任一个是'0',则elem被隐藏。做完这个改变后,无论我跑了多久,我的'SpeedTest'都能得到稳定/一致的结果。 – User2

回答

1

此页面上的第一个答案概括起来很好 Performance of jquery visible

要快速汇总。当使用jquery:visible属性时,你实际上正在检查多个属性。关于你的速度检查,这可能会增加检查。我确定这些速度会因浏览器而异。

+0

谢谢。现在阅读。 – User2

0

我不认为这是内存泄漏。 JavaScript不是多线程的,每次只能执行一项功能,问题在于elem2.is("visible")的过程在您的下一个超时/设置间隔被触发之前花费的时间超过了0秒,因此它被排队,因此对您的时间造成累积影响。

+0

我只在foo()后调用timeout/setinterval;叫做。由于javaScript不是多线程的(不包括工作者),因此在elem2.is(“visible”)之前调用下一个循环是不可能的。叫做。 – User2

+0

恐怕你会得到-1。 – User2