Производительность и «лучшая практика»: с оператором и функцией с кучей параметров - PullRequest
3 голосов
/ 14 апреля 2011

В последнее время я много занимаюсь шаблонизацией в JS, поэтому я постоянно сталкиваюсь с «злым» утверждением with.

Это значительно упрощает работу с шаблонами, так как вы этого не делаете.я должен предварять ваши переменные объектом.

Слыша, что с заявлениями это плохо, а также что они могут привести к снижению производительности, я выбрал другое решение:

Мое решение: Функция с связкой параметров

Вот мой код:

var locals = {
  name : "Matt",
  email : "wahoo@wahoo.com",
  phone : "(555) 555-5555"
};

var keys = [];
var values = [];

for (key in locals) {
  local = locals[key];

  keys.push(key)
  values.push(local);

}

keys = keys.join(',');

var fn = new Function(keys, "**TEMPLATE STUFF**"); // function(name, email, phone) {...}
fn.apply(this, values); // fn("Matt","wahoo@wahoo.com","(555) 555-5555")

Примечание: они выполняют одно и то же.Оба абстрагированы от кого-либо, так что список параметров, вызывающий ужасную длинну, не важен.

Мне интересно, какой из них лучше: использование оператора with или функции с потенциалом для сумасшедшего числа параметров.

Если у кого-то нет лучшего решения ...?

Спасибо!Мэтт Мюллер

Ответы [ 3 ]

1 голос
/ 14 апреля 2011

Вы пробовали шаблонизатор JS?Они, как правило, очень быстрые и сохраняют некоторый код рендеринга.

Я автор pure.js , который немного оригинален, но есть много других доступных и для любоговкус.

1 голос
/ 14 апреля 2011

Я считаю ваше решение очень раздутым.Это совершенно нетривиально, в то время как with очень просто (одна строка кода, которая сама по себе имеет очень небольшую стоимость по сравнению с обходом вашего объекта и созданием массива).Более того, ваше решение требует, чтобы шаблонный объект был готов при создании шаблонной функции (для определения ее параметров), что, на мой взгляд, может оказаться менее гибким.

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

Любая дополнительная производительность, которая может быть получена, кажется, что это будет микрооптимизация, хотя вместо теоретического, просто выполните некоторые тесты.http://jsperf.com/with-vs-fn выполняет весь код установки перед тестом для вашей версии, но выполняет with во время выполнения функции, так что это не совсем справедливо, хотя даже на самых медленных итерациях вы получаете представление о том, как быстроявляется;> 400 000 операций в секунду - самый медленный.Я сомневаюсь, что вам нужно рендерить более 400 000 шаблонов в секунду ...

0 голосов
/ 14 апреля 2011

Проблемы с with связаны не с производительностью, а с неоднозначностью и непредсказуемым поведением.

См., Например, Скрытые возможности JavaScript?

...