Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
放慢javaScript的速度。缺陷jQuery.is(“可见”)_Javascript_Jquery_Debugging_Memory Leaks - Fatal编程技术网

放慢javaScript的速度。缺陷jQuery.is(“可见”)

放慢javaScript的速度。缺陷jQuery.is(“可见”),javascript,jquery,debugging,memory-leaks,Javascript,Jquery,Debugging,Memory Leaks,我有一段代码,它导致了某种内存泄漏。经过几个小时的测试,我终于找到了elem2.is(“:visible”) 我是如何跟踪它的->我的代码在延迟1秒钟后自行循环。我将此延迟设置为0,并节省了执行10次迭代所需的平均时间。我得到了一个整数列表,如下所示 这是我的“速度测试”,没有任何记忆记录等: "4128 , 3964 , 4054 , 3994 , 3946 , 4011 , 4117 , 4044 , 4036 , 3945 , 4031 , 3859 , 4015 , 4019" 我只包

我有一段代码,它导致了某种内存泄漏。经过几个小时的测试,我终于找到了
elem2.is(“:visible”)

我是如何跟踪它的->我的代码在延迟1秒钟后自行循环。我将此延迟设置为0,并节省了执行10次迭代所需的平均时间。我得到了一个整数列表,如下所示

这是我的“速度测试”,没有任何记忆记录等:

"4128 , 3964 , 4054 , 3994 , 3946 , 4011 , 4117 , 4044 , 4036 , 3945 , 4031 , 3859 , 4015 , 4019"
我只包含了第一次查看的结果。但是你可以看到,平均需要4000ms才能完成十次循环

下面是我包含
elem2.is(“:visible”)时的值

正如您所见,执行“x”所需的时间呈指数增长

代码如下:

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

    if(elem1.length && elem2.length && elem2.is(":visible")) {
        // Do stuff
    }
}
有人知道这个函数有什么问题吗?为了避免它减慢我的功能?(我最感兴趣的是找出它为什么也这样做)


谢谢

本页的第一个答案很好地概括了这一点


快速总结。当使用jquery:visible属性时,实际上要检查多个属性。关于你的速度检查,检查可能是累加的。我相信这些速度会因浏览器而异。

我不认为这是内存泄漏。JavaScript不是多线程的,一次只能执行一个功能,问题是
elem2.is(“可见”)
的进程在触发下一个超时/setinterval之前花费了超过0秒的时间,因此它排队,因此会对您的时间造成累积影响。

注意:我已成功删除该错误。使用
elem2.css(“隐藏”)!=改为“无”
。仍然很好奇为什么会出现此错误。注意:我应该提到,只有在执行类似于(var I=0;iNote:最后我使用了
elem[0]。offsetHeight&&elem[0]的操作时,才会出现此错误.offsetWidth
。如果其中一个为“0”,则元素隐藏。执行此更改后,无论运行多长时间,“SpeedTest”都会给出稳定/一致的结果。我只在调用foo();后调用timeout/setinterval。因为javaScript不是多线程的(不包括工作线程)在调用elem2.is(“可见”);之前调用下一个循环是不可能的。恐怕您会得到一个-1。谢谢。现在通读。
function foo() {
    var elem1 = $("#A"),
        elem2 = $("#B");

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