我可以在jQuery中缓存$(window)和$(document)吗?

时间:2013-02-12 16:17:44

标签: jquery performance caching

我最近阅读了一些关于jQuery性能的文章,我提出了一些奇怪的问题。

  • 可以/应该缓存$(window)吗?

    如果我这样做,是否会影响resizescrollwidthscrollTop等等?

  • 可以/应该缓存$(document)吗?

    由于我们使用了很多鼠标操作,我应该var doc = $(document);吗?

  • 我可以总是在一大段代码中缓存$(this)吗?

    对于var self = $(this);self可能与$(this)有什么不同?

3 个答案:

答案 0 :(得分:9)

所有三个问题:是的你可以!

Neccessery:没有

更好的表现:也许

你可以尝试做一个基准测试。但缓存的原因不是搜索整个DOM的选择器。查找文档和窗口不是问题,因为它们是2个根变量。缓存$(这个)取决于情况。见我的第二个提示。

始终缓存您运行查询的父对象:

var header = $('#header');

var menu = header.find('.menu');
// or
var menu = $('.menu', header);

链接jQuery方法比缓存选择器更好:

$('li.menu-item').click(function () {alert('test click');})
                     .css('display', 'block')
                     .css('color', 'red')
                     fadeTo(2, 0.7);

经常查询的缓存元素:

var header = $('#header');
var divs = header.find('div');
var forms = header.find('form');

免费的额外效果提示:

选择器适合最慢:

Id > Tag > classes

答案 1 :(得分:2)

  1. 是的,你可以缓存$(窗口),它确实有助于提高性能 有人已经在jsperf中做过测试。       http://jsperf.com/jquery-window-cache

    测试结果有些混乱,但你仍然可以"运行测试"上 您的浏览器可以看到差异。

  2. 是的,您也可以缓存$(文档)。我不太多使用$(文件), 但基于我在jsperf中进行的测试 (http://jsperf.com/document-vs-cache),缓存$(文档)帮助 表现也有点。

  3. 是的,您可以缓存$(this)。但这个不同于 其他的cahces。如您所知,$(this)的价值将会发生变化 依赖不同的情况。例如,如果在鼠标中使用$(this) 像这样的倾听者......

    $(".button").on("click",function(){
       var $this = $(this);
    }); 
    
    当用户点击带有该类的按钮时,

    $(this)将会改变 "按钮"和$("此")将成为点击的对象 用户。

    如果你经常使用$(this),缓存$(this)可以提高性能 在功能里面。但请记住,如果你在里面缓存$(this) 该函数,缓存将成为局部变量而不是全局变量, 并将在功能结束时销毁。所以你不能胜任 在功能之外使用它。

答案 2 :(得分:0)

实际问题是idreport = report_obj.search(cr, uid, conditions)[0]

如果要缓存窗口或文档以便在同一会话中进一步使用,可以。是的。

如果用户关闭窗口/会话,您创建的所有变量/函数都将被垃圾收集。