javascript - JavaScript 局部变量是否应该间歇性地使用来提高性能?

标签 javascript jquery performance

考虑脚本的以下两部分。第一个代码短了一行,并且使用了一个较少的变量 $t,但是,又将 this 转换为 jQuery 对象。

从性能(而非可读性)的 Angular 来看,一个比另一个更好吗?

如果第一个更好,是否有人想要使用第二个,例如我需要将 this 转换为 jQuery 对象一百次?何时应该进行这种转变有任何经验法则吗?

$(".click").click(function(){
    $('body').data('link',$(this));
    $("#dialog").data('id',$('#id').val()).data('status',$(this).text()).dialog("open");
});

$(".click").click(function(){
    var $t=$(this);
    $('body').data('link',$t);
    $("#dialog").data('id',$('#id').val()).data('status',$t.text()).dialog("open");
});

最佳答案

它可能会更快,因为 $() 做了一些工作来弄清楚你给它的是什么。当您为 $() 提供 DOM 元素时,这不太可能重要。如果你没有陷入紧密的循环中,那并不重要。处理点击并不完全是性能关键的代码。

当您重复查询 DOM 时,就会出现差异,例如:

$(".foo[data-nifty]").doThis();
$(".foo[data-nifty]").doThat();
$(".foo[data-nifty]").doTheOther();

在那里,您无缘无故地强制在 DOM 中重复搜索具有类 foodata-nifty 属性的所有元素。现在,除非这是在循环中,否则可能也不重要,但这正是您应该注意的地方。如果这三个方法都是可链接的,请编写一个链,或使用临时变量。

一般来说,编写可读的代码,尽早并经常进行测试,当您看到现实世界的性能问题时,请处理它们。

相反的情况也值得寻找:

$(".foo").click(function() {
    var $t = $(this);
    $t.doThis();
    $t.doThat();
    $t.find(".something").not(".hooked").addClass("hooked").on("click", function() {
        // Do something here without using `$t`...
    });
});

在那里,我们在单击的 .foo 元素中查找任何没有 .hooked.something,并且,如果找到了,向其添加一个点击处理程序。 (这显然是很人为的;我们会使用事件委托(delegate)来代替。但假设这是我们真正会编写的东西。)

理论上,如果有任何新的 .something 被钩住,那么它们的事件处理程序将被保留,并且由于它是对该单击上下文的闭包,因此$t 变量保存在内存中,这意味着 $t 变量引用的任何内容也保存在内存中。因此,我们最终可能会使用比理想情况更多的内存。 (因为 $t 中的 DOM 元素集不需要保留在 $t 中。)

在实践中,现代引擎有时可以“优化”闭包,释放理论认为它们需要保留的变量,如果它们能够向自己证明它们可以做到这一点而不会造成副作用。但在不需要的时候依赖它并不理想。在上面,您可以在末尾添加 $t = undefined;$t = null; 来释放它引用的 jQuery 集。调用的上下文和 $t 变量可能仍会保留(除非 JavaScript 引擎优化),但至少用于引用的 jQuery 集 $t 不会被保留.

关于javascript - JavaScript 局部变量是否应该间歇性地使用来提高性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27799171/

相关文章:

javascript - 在 Jquery 中循环更改文本

linux - 如何更好地配置 linux/CPU 以运行大型软件 (NUMA)

javascript - express.route 如何确定路线

javascript - 在谷歌浏览器中点击图片后,如何去除图片周围出现的边框?

javascript - 从 webservice 返回值的函数

javascript - 使用 jQuery 检测字体大小(以像素为单位)

javascript - 为什么 Array.concat 在连接 jQuery 对象的二元素和三元素数组时会生成三元素数组?

JavaScript - 预呈现另一个页面

python - 用 c++ 重写这个 python 函数似乎让它运行得慢了很多。这合理吗?

javascript - 如何使用 javascript 访问 Windows 注册表?