Влияет ли использование анонимных функций на производительность? - PullRequest
81 голосов
/ 17 сентября 2008

Мне было интересно, есть ли разница в производительности между использованием именованных функций и анонимных функций в Javascript?

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;
}

Первый более аккуратный, поскольку он не загромождает ваш код редко используемыми функциями, но имеет ли значение, что вы повторно объявляете эту функцию несколько раз?

Ответы [ 12 ]

0 голосов
/ 17 сентября 2008

@ nickf

Это довольно глупый тест, хотя вы сравниваете время выполнения и времени компиляции, которое, очевидно, будет стоить метода 1 (компилируется N раз, в зависимости от механизма JS) с методом 2 (компилируется один раз) , Я не могу себе представить разработчика JS, который бы таким образом проходил свой код написания пробации.

Гораздо более реалистичным подходом является анонимное присваивание, так как фактически вы используете метод document.onclick больше похож на следующий, который на самом деле слегка предпочитает метод anon.

Используя тестовый фреймворк, аналогичный вашему:


function test(m)
{
    for (var i = 0; i < 1000000; ++i) 
    {
        m();
    }
}

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

var test1 = named;

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

document.onclick = function() {
    var start = new Date();
    test(test1);
    var mid = new Date();
    test(test2);
    var end = new Date();
    alert ("Test 1: " + (mid - start) + "ms\n Test 2: " + (end - mid) + "ms");
}
0 голосов
/ 17 сентября 2008

То, что определенно ускорит ваш цикл в различных браузерах, особенно в браузерах IE, заключается в следующем:

for (var i = 0, iLength = imgs.length; i < iLength; i++)
{
   // do something
}

Вы поместили произвольную 1000 в состояние цикла, но вы получите мой дрейф, если хотите просмотреть все элементы в массиве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...