Какой из них лучше выполняет функцию или объект в Javascript / Jquery?

#jquery #performance #function #object

#jquery #Производительность #функция #объект

Вопрос:

 //Object approach
$.myutils = {
    addNumbers : function(a,b){
        //assuming a and b are integers for simplicity
        return a   b;
    }
    subNumbers : function (a,b){
        //assuming a and b are integers for simplicity
        return a - b;
    }
};
//Usage
$.myutils.addNumbers(20,10);
$.myutils.subNumbers(20,10);

//function approach
$.myutils = function()
{
    return {
        addNumbers : _addNumbers,
        subNumbers : _subNumbers
    };
    _addNumbers : function(a,b){
        //assuming a and b are integers for simplicity
        return a   b;
    }
    _subNumbers : function (a,b){
        //assuming a and b are integers for simplicity
        return a - b;
    }   
}
//Usage
$.myutils().addNumbers(20,10);
$.myutils().subNumbers(20,10);
  

Комментарии:

1. jsperf.com на помощь

2. Второй пример выдаст ошибку синтаксического анализа… _addNumbers : function недопустимый синтаксис.

3. @Domenic Второй подход не будет работать в его нынешнем виде, но синтаксис допустим 😉 _addNumbers является меткой и function используется в контексте инструкции. Однако код {addNumbers: _addNumbers, ... выдаст исключение ошибки ссылки, потому что _addNumbers «не определено».

Ответ №1:

Хотя это можно считать случаем преждевременной оптимизации, рассмотрим случай, когда семантика отличается и первый метод, вероятно, предпочтительнее (поскольку не сохраняется дополнительное состояние).

В любом случае, первый метод «objects» «быстрее» (для некоторого значения «быстрее»), потому что вызываются те же функции, которые являются свойствами того же объекта.

Второй метод «functions» будет «медленнее» (для некоторого значения «медленнее»), потому что каждый раз, когда выполняется myutils функция (но помните, что функции также являются объектами), он возвращает новый объект, который имеет новые функции в качестве свойств. Таким образом, просто по определению is должен выполнять больше работы. (Кроме того, второй метод не будет выполняться в том виде, в каком он есть, я перевел его в «рабочий код» в моей голове.)

Удачного кодирования.


Следуя комментарию zerkms, я добавил тестовый пример jsperf:http://jsperf.com/5931661 (Он также включает соответствующие исправления ошибок; оба «примера» были фактически сломаны).

Ответ №2:

Краткий ответ: объект быстрее.

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