Organización de archivos

  • Todos los archivos JavaScript deben colocarse en la carpeta pública '''script''' del proyecto.
  • Los archivos de bibliotecas de terceros utilizados se colocan en la carpeta '''script/lib'''.
  • Los módulos personalizados reutilizables se colocan en la carpeta '''script/commons'''. Si un módulo reutilizable involucra varios subarchivos, es necesario crear una carpeta de módulo independiente.
  • Los archivos JavaScript utilizados por los módulos de páginas individuales se colocan en la carpeta '''script/{module_name}'''.
  • Los datos JSON simulados del proyecto se colocan en la carpeta '''script/json''', creando subcarpetas independientes según la página.
  • Cuando JavaScript utiliza un framework MVC, los archivos de plantilla se colocan en la carpeta '''script/templates''', creando subcarpetas independientes según la página.

Formato

  • Los principios generales pueden consultarse en [PhpGuideline Normas de codificación de PHP].
  • Usa siempre 'var' para definir variables.
var global = '';

function method() {
    var local = '';
}
  • Termina siempre las declaraciones con punto y coma.
  • No uses comas extra en arrays y objetos (compatible con IE).
//wrong
var arr = [1,2,];
var person = {
    name: 'name',
    age: 20,
};
//wrong
var arr = [1,2];
var person = {
    name: 'name',
    age: 20
};
  • Define un espacio de nombres de nivel superior como 'inBike', y debajo de él define espacios de nombres privados personalizados, clasificados según el módulo.
  • Coloca todo el código de los módulos en una función anónima autoejecutable y exponlo asignándolo al espacio de nombres personalizado bajo el objeto window.
if (!window.inBike) {
    window.inBike = {};
}
window.inBike.rideway = rideway;
  • El código de enlace de eventos debe ejecutarse dentro de la función 'dom ready'.
$(function() {
     //bind function is in the init function
     window.inBike.rideway.init();
})
  • Coloca los métodos de los módulos personalizados en un objeto; el nombre del método va inmediatamente después de ':', hay un espacio entre ':' y 'function', y hay un espacio entre 'function()' y la siguiente '{'.
var module = function() {
    method: function() {

    }
};
  • Usa comillas simples para las cadenas.
var str = 'some text';
  • Todas las variables deben definirse antes de usarse e inicializarse inmediatamente después de definirse.
var obj = null;
var num = 0;
var arr = [];
var isEmpty = true;
  • Antes de usar la herramienta console del navegador, primero hay que verificar si es compatible.
if (console) {
    console.log('this is my log');
}

Nombres

  • Los principios generales pueden consultarse en [PhpGuideline Normas de codificación de PHP].
  • Usa notación camelCase para variables y métodos, con la primera letra en minúscula; para nombres de clases, la primera letra en mayúscula.
var numberList = [1,2];
var util = {
    removeNode: function(){
        ....
    }
};

function Person(name, age) {
    this.name = name;
    this.age = age;
}
  • Usa $name para nombrar objetos de jQuery, elementos DOM nativos con 'dom' al inicio, y variables privadas dentro de objetos con guion bajo al inicio.
var $image = $('#cover');
var domImage = document.getElementById('cover');
var obj = {
    _privateVar: null,
    method: function() {

    }
};

Comentarios

  • Los principios generales pueden consultarse en [PhpGuideline Normas de codificación de PHP].
  • Usa más comentarios de una sola línea para indicar el significado de los bloques lógicos.
// Handle the case where IE and Opera return items
// by name instead of ID
if ( elem.id !== match[2] ) {
    return rootjQuery.find( selector );
}

// Otherwise, we inject the element directly into the jQuery object
this.length = 1;
this[0] = elem;
  • Indica el método constructor de la clase.
/**
 * @constructor
 */
some.long.namespace.MyClass = function() {
};
  • Anota el tipo y el significado de las constantes de enumeración.
/** @enum {string} */
some.long.namespace.Fruit = {
  APPLE: 'a',
  BANANA: 'b'
};
  • Usa comentarios para identificar la visibilidad de métodos o variables, facilitando la verificación estática.
/** @protected */
AA_PublicClass.staticProtectedProp = 31;

/** @private */
AA_PublicClass.prototype.privateMethod_ = function() {};

Mejores prácticas

  • Evita usar 'eval'.
  • Evita usar 'with' para objetos y 'for-in' para arrays.
  • Usa los closures con precaución y evita las referencias circulares.
  • Ten cuidado con el contexto de 'this'.
var $button = $('#my-button');
$button.click(function(){
    var self = this;
    var util = {
       getVal: function() {
           return self.val();
       }
    }
});
  • Usa código corto siempre que sea posible, por ejemplo el operador ternario, conmutadores lógicos, incrementos, etc.
var name = ('undefined' == typeof(name)) ? '' : name;
(age < 0) && (age = 0);
count++;
  • No uses 'function' dentro de ámbitos de bloque.
// 错误
if (x) {
  function foo() {}
}

// 正确
if (x) {
  var foo = function() {}
}
  • Enlaza el listener de eventos en el nodo padre y responde según el origen del evento.
  • Para módulos de página complejos, usa bibliotecas de gestión de dependencias como SeaJS, RequireJS, o frameworks MVC como Backbone, Knockout, Stapes para organizar tu código.