Какие антишаблоны существуют для JavaScript? [закрытый]

Как вы говорите, вам нужно показать код. : -)

Ошибка переполнения стека обычно происходит, когда ваша функция вызывает слишком много гнезд. См. Поток «Переполнение потока стека» для некоторых примеров того, как это происходит (хотя в случае этого вопроса ответы преднамеренно вызывают переполнение стека).

49
задан BobbyShaftoe 18 December 2008 в 14:39
поделиться

8 ответов

Помимо уже упомянутых...

  • Используя эти for..in конструкция для итерации по массивам
    (выполняет итерации по методам массива И индексам)

  • Используя JavaScript, встроенный как <body onload="doThis();">
    (негибкий и предотвращает несколько слушателей события)

  • Используя 'Функцию ()' конструктор
    (плохо по тем же причинам eval() плохо)

  • Передающие строки вместо функций к setTimeout или setInterval
    (также использование eval() внутренне)

  • Доверие неявным операторам, не используя точки с запятой
    (дурная привычка взять, и может привести к неожиданному поведению)

  • Используя/*.. */для блокирования строк кода
    (может вмешаться в regex литералы, например: /* /.*/ */)

    < evangelism> И конечно, не используя Прототип;) </evangelism>

19
ответ дан Triptych 7 November 2019 в 21:32
поделиться

Язык:

  • загрязнение Пространства имен путем создания большого места переменных в глобальном контексте.

  • обработчики Событий привязки в форме 'foo.onclick = myFunc' (нерастяжимый, должен использовать attachEvent/addEventListener).

  • Используя оценку почти в любом non-JSON контексте

  • Почти каждое использование document.write (используют методы DOM как document.createElement)

  • Разработка прототипа против Объектного объекта (БУМ!)

  • А маленький это, но выполнение больших количеств строки concats с '+' (создание массива и присоединение к нему намного более эффективны)

  • что касается несуществующего undefined постоянный

Дизайн/Развертывание:

  • (Обычно) не обеспечение noscript поддержка.

  • Не упаковка Вашего кода в единственный ресурс

  • встроенное Помещение (т.е. тело) сценарии около вершины тела (они блочная загрузка)

конкретный Ajax:

  • не указание на запуск, конец или ошибку запроса пользователю

  • опрос

  • передача и парсинг XML вместо JSON или HTML (где соответствующий)

редактирование: Я продолжаю думать о больше!

46
ответ дан annakata 7 November 2019 в 21:32
поделиться

Самое большое для меня не понимает сам язык программирования JavaScript.

  • иерархии объектов Злоупотребления и создание очень глубоких цепочек наследования. Мелкие иерархии хорошо работают в большинстве случаев в JS.
  • Не понимающая основанная на прототипе объектная ориентация и вместо этого создание огромных сумм лесов, чтобы заставить JS вести себя как традиционные языки OO.
  • Излишне использование парадигмы OO, когда процедурный / функциональное программирование могло быть более кратким и эффективным.

Тогда существуют те для времени выполнения браузера:

  • Не использующие хорошие установленные шаблоны события как делегация события или шаблон "наблюдатель" (pub/sub) для оптимизации обработки событий.
  • Создание частые обновления DOM (как .appendChild в цикле), когда узлы DOM могут быть в памяти и добавлены сразу. (ОГРОМНЫЙ выигрыш в производительности).
  • библиотеки Злоупотребления для выбора узлов со сложными селекторами, когда собственные методы могут использоваться (getElementById, getElementByTagName, и т.д.). Это становится меньшим из проблемы в эти дни, но это стоит упомянуть.
  • Расширяющиеся Объекты DOM, когда Вы будете ожидать, что сторонние сценарии будут на той же странице как Ваш (Вы закончите тем, что ударили код друг друга).

И наконец проблемы развертывания.

  • Не уменьшение Ваших файлов.
  • конфигурации веб-сервера - не gzipping Ваши файлы, не кэшируя их разумно.

< разъем> у меня есть [приблизительно 110] клиентские подсказки по оптимизации , которые покрывают некоторые вещи, которые я упомянул выше, и больше, на моем блоге < / разъем>

11
ответ дан Rakesh Pai 7 November 2019 в 21:32
поделиться
  • определение браузера (вместо того, чтобы тестировать, хотите ли определенные методы/поля Вы использовать, существуют)
  • предупреждение использования () в большинстве случаев

видит также Crockford "JavaScript: Хорошие Части" для различных других вещей избежать. ( редактирование: предупреждение, он немного строг в некоторых его предложениях как использование "===" по "==", так возьмите их с любой мелкой частицей соленых работ для Вас)

9
ответ дан Jason S 7 November 2019 в 21:32
поделиться

Несколько вещей прямо сверху моей головы. Я отредактирую этот список, когда я буду думать о больше.

  • не загрязняют глобальное пространство имен. Организуйте вещи в объектах вместо этого;
  • не опускают 'var' для переменных. Это загрязняет глобальное пространство имен и могло бы получить Вас в проблеме с другими такими сценариями.
8
ответ дан Vilx- 7 November 2019 в 21:32
поделиться

любое использование 'с'

с (document.forms["mainForm"].elements) {
input1.value = "спам";
input2.value = "спам";}

6
ответ дан Greg Dean 7 November 2019 в 21:32
поделиться

любая ссылка на

document.all

в Вашем коде, , если это не в специальном коде, только для IE для преодоления ошибки IE. ( кашель document.getElementById () кашель )

5
ответ дан scunliffe 7 November 2019 в 21:32
поделиться

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

4
ответ дан Allain Lalonde 7 November 2019 в 21:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: