Javascript - Аргументы против вложенных функций против производительности - PullRequest
5 голосов
/ 25 декабря 2011

Вопрос по javascript noob - какой из следующих вариантов является наилучшим практическим и дружественным по отношению к производительности, также приветствуем любые другие предложения.Это самая простая версия оригинального проекта.Будет более 20 переменных и более 10 внутренних функций (например, «процесс» в данном случае).

Преимущество метода 1 состоит в том, что ему не нужно посылать аргументы функциям, но, поскольку он вкладывает всефункции внутри главной функции (возможно, восстановить все внутренние функции для каждого экземпляра Foo).Хотя метод 2 свободен от вложенности функций, но требует много аргументов.Обратите внимание, что также будет несколько экземпляров конструктора Foo.

Метод 1:

function Foo () {
    var a = 1;
    var b = 2;
    var c = (a+b)/2;
    var $element = $('#myElement');

    var process = function (){
        var x = a+b+c;
        $element.css('left', x)
        return x;
    }   
    x = process ();
}

Метод 2:

function Foo () {
    var a = 1;
    var b = 2;
    var c = (a+b)/2;
    var $element = $('#myElement'); 
    x = process (a, b, c, $element);
} 

function process (a, b, c, $element){
    $element.css('left', x)
    return x;
}

Ответы [ 2 ]

4 голосов
/ 25 декабря 2011

Разделенные функции - это определенно способ достичь производительности.Хотя бывают ситуации, когда было бы неплохо иметь переменную область видимости для вложенных функций, при большой функции снижение производительности может быть огромным.

Имейте в виду, что каждый раз, когда вызывается Foo, процесс var перераспределяет всепамять для новой функции, которая создается, вместо того, чтобы хранить функцию в памяти и просто передавать ей новые параметры.Если функция большая, то это будет довольно сложной задачей для интерпретатора Javascript.

Вот некоторые точные цифры, которые также могут помочь (Содержит сравнения производительности и фактические тесты, которые вы можете запустить самостоятельно.браузер): http://jsperf.com/nested-functions-speed, http://jsperf.com/nested-named-functions/5

2 голосов
/ 04 июня 2012

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

Я опубликовал в блоге мои выводы и создал тест производительности для поддержки этого утверждения.

РЕДАКТИРОВАТЬ: тест не пройден, после исправления тест показывает, что все еще быстрее не вкладывать функции.

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