当前位置:  开发笔记 > 编程语言 > 正文

使用匿名函数会影响性能吗?

如何解决《使用匿名函数会影响性能吗?》经验,为你挑选了2个好方法。

我一直想知道,在Javascript中使用命名函数和匿名函数之间是否存在性能差异?

for (var i = 0; i < 1000; ++i) {
    myObjects[i].onMyEvent = function() {
        // do something
    };
}

VS

function myEventHandler() {
    // do something
}

for (var i = 0; i < 1000; ++i) {
    myObjects[i].onMyEvent = myEventHandler;
}

第一个是更整洁,因为它不会使用很少使用的函数使代码混乱,但重要的是你多次重新声明该函数是否重要?



1> Atif Aziz..:

这里的性能问题是在循环的每次迭代中创建新函数对象的成本,而不是使用匿名函数的事实:

for (var i = 0; i < 1000; ++i) {    
    myObjects[i].onMyEvent = function() {
        // do something    
    };
}

您正在创建一千个不同的函数对象,即使它们具有相同的代码体并且没有绑定到词法范围(闭包).另一方面,以下似乎更快,因为它只是在整个循环中为数组元素分配相同的函数引用:

function myEventHandler() {
    // do something
}

for (var i = 0; i < 1000; ++i) {
    myObjects[i].onMyEvent = myEventHandler;
}

如果您在进入循环之前创建匿名函数,那么只有在循环内部时才将对它的引用分配给数组元素,您会发现与命名函数版本相比,没有任何性能或语义差异:

var handler = function() {
    // do something    
};
for (var i = 0; i < 1000; ++i) {    
    myObjects[i].onMyEvent = handler;
}

简而言之,使用匿名命名函数没有可观察到的性能成本.

顺便说一下,从上面看,两者之间没有区别:

function myEventHandler() { /* ... */ }

和:

var myEventHandler = function() { /* ... */ }

前者是函数声明,而后者是匿名函数的变量赋值.尽管它们似乎具有相同的效果,但JavaScript确实对它们的处理方式略有不同.为了理解差异,我建议阅读" JavaScript函数声明模糊 ".

任何方法的实际执行时间主要取决于浏览器的编译器和运行时的实现.有关现代浏览器性能的完整比较,请访问JS Perf站点


JS Perf示例中是否没有缺陷:情况1仅_defines_函数,而情况2和3似乎无意中_call_该函数。

2> nickf..:

这是我的测试代码:

var dummyVar;
function test1() {
    for (var i = 0; i < 1000000; ++i) {
        dummyVar = myFunc;
    }
}

function test2() {
    for (var i = 0; i < 1000000; ++i) {
        dummyVar = function() {
            var x = 0;
            x++;
        };
    }
}

function myFunc() {
    var x = 0;
    x++;
}

document.onclick = function() {
    var start = new Date();
    test1();
    var mid = new Date();
    test2();
    var end = new Date();
    alert ("Test 1: " + (mid - start) + "\n Test 2: " + (end - mid));
}

结果:
测试1:142ms测试2:1983ms

似乎JS引擎无法识别它在Test2中的功能是相同的,并且每次都编译它.


我在Chrome 23上的时间:(2ms/17ms),IE9:(20ms/83ms),FF 17:(2ms/96ms)
该测试在哪个浏览器中进行?
该测试没有看上去那么有用.在两个示例中都没有实际执行内部功能.实际上,所有这个测试都显示创建一个10000000次的函数比创建一次函数要快.
推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有