#summary Style guide for JavaScript code contributed to Melange
#labels Importance-Deprecated,Phase-Guidelines,Contents-Draft

As more Javascript code in Melange is going to be developed, here's a draft for code guidelines. These guidelines are inspired by [PythonStyleGuide] page (but adapted to JS), and from [http://javascript.crockford.com/code.html Code conventions for the Javascript Programming Language]. In this very moment our code doesn't respect them, but these are going to be strict rules when [JavascriptRefactoring] will come to an end. More infos on  _why_ these rules are important later.

As poor-written Javascript is more dangerous than as it's in other languages, we're going to use [http://www.jslint.com/ Jslint] to verify code conventions compliance. See [JavascriptRefactoring] for more information on how to use it.

More infos on how to write good Javascript code on [http://dev.opera.com/articles/view/efficient-javascript/ Efficient javascript article] and in [http://www.jslint.com/lint.html Jslint code checking rules], some [http://www.klauskomenda.com/code/javascript-programming-patterns/ useful patterns] and a great [http://www.jibbering.com/faq/faq_notes/closures.html article about closures]

= Javascript Language Rules =
1. _Private and public/privileged vars/functions_: we're going to use [http://www.klauskomenda.com/code/javascript-programming-patterns/#module Module pattern], more info in [JavascriptRefactoring] page.

2. _With statement_: Do *not* use *with* statement. If you want to provide shortcuts, just create a variable that points to the object you want to access repeatedly. See explanations on [http://yuiblog.com/blog/2006/04/11/with-statement-considered-harmful/ why with statement is harmful]

3. _Iterations_: as we've jQuery always loaded, use [http://docs.jquery.com/Utilities/jQuery.each jQuery's each() function] to iterate over objects/arrays. Do not use *for...in* loops, as they can lead to [http://yuiblog.com/blog/2006/09/26/for-in-intrigue/ potential errors]

4. _Ajax calls_: *always* use {{{?=_"+(new Date().getTime())}}} when invoking an URL to avoid caching issues

5. _Global namespace pollution_: at least *avoid* it (more infos when we come to an agreement for [JavascriptRefactoring])

= Javascript Style Rules =

1. _Semicolons_: *Always*, *not* after functions as in:

{{{

function foo() {
};

}}}

This is unnecessary. But *yes* when you're storing an anonymous function inside a variable like this:

{{{

var foo = function () {
};

}}}

2. _Line length_: *80* columns maximum. If you need to break one line, indent it by *2* spaces

3. _Indentation_: *2* spaces (*no tabs*)

4. _Whitespaces_: *no* whitespaces inside parentheses, brackets or braces

5. _HTML Django templates_: there should be *no* code in them

6. _Comments_: use [http://code.google.com/p/jsdoc-toolkit/ JSDocToolkit] style

7. _Functions_: *no space* between the _name of the function_ and the parenthesis

8. _Anonymous functions_: *1 space* between the word _function_ and the parenthesis

9. _Immediately invoked functions_: wrap them *between parenthesis*, as in:
{{{
var myvar = (function () {
  return true;
}());
}}}

10. _Objects and arrays_: use {{{ {} }}} to declare objects (not {{{new Object()}}}) and {{{[]}}} to declare arrays (not {{{new Array()}}})

11. _Variables_: always use *var*, otherwise the variable will pollute the global namespace

12. _Primitive objects_: *never* extend their prototype

13. _String concatenation_: use

{{{
var concatenated = ["string1","string2"].join("");
}}}

instead of

{{{
var concatenated = "string1" + "string2";
}}}

It's usually faster for browsers and more beautiful when new lines are needed because line is too long.

If line is too long or you're going to store HTML, than indent it like this:

{{{
var foo = [
  '<div>',
  '  <table>',
  '  </table>',
  '</div>'
].join("");
}}}

This won't break jsLint and helps understanding indentation in the HTML code as well.