Кешируются ли локальные объявления функций? - PullRequest
7 голосов
/ 24 марта 2011
function A() {
     function B() {
          ...
     }        
     B();
}

Является ли функция B созданной каждый раз, когда вызывается A, или на ней есть какое-то кэширование. Не делает его локальным, как:

function A() {
    B();
}
function B() {
    ...
}

Значительное улучшение производительности?

Допустимо ли делать этот выбор стиля? (B в этом случае - просто вспомогательная функция для A.) Или следует отдавать предпочтение второму по скорости?

Следует ли использовать этот стиль или избегать его для удобства чтения?

Benchmark .

Похоже на FF4 inline B для локального регистра и удаляет накладные расходы на вызов функции.

А как насчет других браузеров?

Ответы [ 3 ]

4 голосов
/ 02 апреля 2011

Объявление внутренней функции в JS может иметь целью лексическую привязку к локальным переменным / аргументам внешней функции.Выделение этой функции как функции верхнего уровня отрицательно сказывается на этой цели.

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

0 голосов
/ 25 марта 2011

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

У кого-нибудь есть ответ на этот вопрос?

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

0 голосов
/ 24 марта 2011

Raynos, я посмотрел ваши тесты jsperf, и похоже, что вы тестируете объявление функции, а не ее выполнение.

См. Ссылку ниже. Это полезно?

Еще один тест

Я бы сказал, что:

  1. В вашем примере кода B создается каждый раз, когда вызывается A. (В моем примере, связанном с выше, см. Внешний обычный тест.)

  2. В процентном отношении, улучшение производительности является значительным. Но если функция реального мира выполняется за микросекунды, вы можете не заметить разницы.

  3. Другое соображение состоит в том, насколько важно, чтобы B (вспомогательная функция) была «частной» (другими словами, видимой только внутри A). См. Функцию Outer Immediate в моей ссылке, чтобы найти вариант для середины дороги.

...