| #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. |