Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What anti-patterns exist for JavaScript? [closed]

I find that what not to do is a harder lesson to learn than what should be done.

From my experience, what separates an expert from an intermediate is the ability to select from among various seemingly equivalent ways of doing the same thing.

So, when it comes to JavaScript what kinds of things should you not do and why?

I'm able to find lots of these for Java, but since JavaScript's typical context (in a browser) is very different from Java's I'm curious to see what comes out.

like image 633
Allain Lalonde Avatar asked Dec 18 '08 14:12

Allain Lalonde


People also ask

What are anti-patterns in JavaScript?

To summarize, an anti-pattern is a bad design that is worthy of documenting. Examples of anti-patterns in JavaScript are the following: Polluting the global namespace by defining a large number of variables in the global context.

What are common anti-patterns?

Spaghetti Code This is one of the most common types of anti-pattern you will find in software development. You write some code, you implement some features, it worked and you proceed further to implement several other features in your software but you didn't pay attention to the coding conventions or making it cleaner.

How many anti-patterns are there?

The six anti-patterns I will discuss in this article are Spaghetti Code, Golden Hammer, Boat Anchor, Dead Code, Proliferation of Code and the God Object.

Does JavaScript have design patterns?

JavaScript modules are the most prevalently used design patterns for keeping particular pieces of code independent of other components. This provides loose coupling to support well-structured code. For those that are familiar with object-oriented languages, modules are JavaScript “classes”.


2 Answers

Language:

  • Namespace polluting by creating a large footprint of variables in the global context.

  • Binding event handlers in the form 'foo.onclick = myFunc' (inextensible, should be using attachEvent/addEventListener).

  • Using eval in almost any non-JSON context

  • Almost every use of document.write (use the DOM methods like document.createElement)

  • Prototyping against the Object object (BOOM!)

  • A small one this, but doing large numbers of string concats with '+' (creating an array and joining it is much more efficient)

  • Referring to the non-existent undefined constant

Design/Deployment:

  • (Generally) not providing noscript support.

  • Not packaging your code into a single resource

  • Putting inline (i.e. body) scripts near the top of the body (they block loading)

Ajax specific:

  • not indicating the start, end, or error of a request to the user

  • polling

  • passing and parsing XML instead of JSON or HTML (where appropriate)

Many of these were sourced from the book Learning JavaScript Design by Addy Osmati: https://www.oreilly.com/library/view/learning-javascript-design/9781449334840/ch06.html

edit: I keep thinking of more!

like image 134
annakata Avatar answered Oct 16 '22 10:10

annakata


Besides those already mentioned...

  • Using the for..in construct to iterate over arrays
    (iterates over array methods AND indices)

  • Using Javascript inline like <body onload="doThis();">
    (inflexible and prevents multiple event listeners)

  • Using the 'Function()' constructor
    (bad for the same reasons eval() is bad)

  • Passing strings instead of functions to setTimeout or setInterval
    (also uses eval() internally)

  • Relying on implicit statements by not using semicolons
    (bad habit to pick up, and can lead to unexpected behavior)

  • Using /* .. */ to block out lines of code
    (can interfere with regex literals, e.g.: /* /.*/ */)

    <evangelism> And of course, not using Prototype ;) </evangelism>

like image 30
Kenan Banks Avatar answered Oct 16 '22 10:10

Kenan Banks