javascript - "click"事件调用外部函数而不是作用域函数。这本质上就像将内联 javascript 附加到 dom 吗?

标签 javascript jquery benchmarking scope

我的一个 friend (他比我更熟练使用 javascript)最近正在帮助我优化一些代码,他提到的可能有帮助的事情之一是调用外部函数而不是使用作用域函数。然而,这实际上似乎对性能没有太大影响(如果有的话)。任何更熟悉 javascript 内部工作原理的人都会解释为什么会出现这种情况吗?有什么理由使用一种方法而不是另一种方法吗?

我的意思是:

function showI(e) {
    var iVal = $(e).attr('iteration');
    var iValx99 = iVal * 99;
    var iValx999 = iVal * 999;
    alert(iVal + ' // ' + iValx99 + ' // ' + iValx999);
}
var element;
for (var i = 0; i < 50; i++) {
    element = $('<div />', {
        'class': 'iteration',
        'iteration': i
    });
    element.on('click', function() {
        showI(element);
    });
    element.appendTo('body');
}

对比:

var element;
for (var i = 0; i < 50; i++) {
    (function() {
        var j = i;
        element = $('<div />', {
            'class': 'iteration'
        });
        element.on('click', function() {
            var iVal = j;
            var iValx99 = iVal * 99;
            var iValx999 = iVal * 999;
            alert(iVal + ' // ' + iValx99 + ' // ' + iValx999);
        });
        element.appendTo('body');
    })();
}

jsperf 基准测试示例:

http://jsperf.com/function-click-on-every-element-vs-calling-a-function/2

最佳答案

好吧,无论如何,每次都定义一个新函数,你就会放弃使用静态函数所带来的性能提升。

他的意思可能是使用这个:

element.on('click', showI ); //Just passing an already created function is cheaper than creating a new function object everytime

您甚至不需要绑定(bind)它 50 次:

$("body").on("click", ".iteration", showI );

并修改showI:

function showI(e) {
    var iVal = $(this).attr('iteration');
    var iValx99 = iVal * 99;
    var iValx999 = iVal * 999;
    alert(iVal + ' // ' + iValx99 + ' // ' + iValx999);
}

这在修改后的 jsperf 中要快得多 http://jsperf.com/function-click-on-every-element-vs-calling-a-function/3

jsfiddle:http://jsfiddle.net/RgU5z/

关于javascript - "click"事件调用外部函数而不是作用域函数。这本质上就像将内联 javascript 附加到 dom 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11491567/

相关文章:

performance - Fortran的表现

javascript - 有人可以帮我解决这个错误吗?

javascript - 使用 Multer 重命名上传的文件不起作用 (Express.js)

linux - 如何分析 NetPIPE 基准测试的结果

c - OCaml 微基准测试

jquery - 如何删除 session Cookie?

javascript - 了解何时以及如何使用 Require.JS

javascript - 等待第二个 promise

javascript - 如何在没有内存泄漏的情况下删除 DOM 元素?

javascript - Jquery 将一个 div 滑出浏览器窗口的一侧