2012-08-21 30 views
7

Las inspecciones de JSHint ahora integradas en PhpStorm me informaron sobre los números mágicos de JavaScript y me doy cuenta de que hará que el código sea más claro para evitar su uso.Evitar el uso de números mágicos en JavaScript: alternativas que funcionan con JsHint

yo probamos este:

var constants = { 
    millisecs: 1000, 
    secs: 60 
}; 

y también esto:

var constants = function() { 
    this.millisecs = 1000; 
    this.getMillisecs = function() { 
     return this.millisecs; 
    }; 
}; 

JsHint se queja de ambos.

Tomando la solución de this answer aunque funciona bien:

var constants = (function() { 
    var millisecs = 1000, 
     defaultMsgsPerSecond = 60; 
    this.getMillisecs = function() { return millisecs; }; 
    this.getDefaultMsgsPerSecond = function() { return defaultMsgsPerSecond; }; 
})(); 

Es de suponer que debido al cierre. ¿Por qué es esto aceptado, mientras que las otras dos sugerencias tomadas de otra pregunta SO no lo son?

Editar: Aunque no desencadena un error, en realidad no funciona. Errores para decir constantes no está definido. JsFiddle.

Para aclarar - por "obras" quiero decir "no desencadena una advertencia de JsHint"

+0

Un problema que aparece con claridad con sus dos primeros ejemplos de código, pero que faltan en el ejemplo de código de este último, es que las "constantes" no son tan constante - es decir, se pueden cambiar más adelante en el código (con 'constantes .millisecs = 100; '). – penartur

+0

@penartur que me parece la respuesta: el ejemplo de trabajo se llama a sí mismo de inmediato, haciendo que sus propiedades sean privadas y, por lo tanto, solo los dos buscadores quedan expuestos. – bcmcfc

+0

@ Wouter-Huysentruit por favor podrías explicar tu edición? – bcmcfc

Respuesta

3

sobre su edición

creo que quería new el objeto en línea:

var constants = new (function() { 
    var millisecs = 1000, 
     defaultMsgsPerSecond = 60; 
    this.getMillisecs = function() { return millisecs; }; 
    this.getDefaultMsgsPerSecond = function() { return defaultMsgsPerSecond; }; 
})(); 

Pero JSHint también se quejará de eso: Weird construction. Is 'new' unnecessary?.

Si lo usa como cierre, debe devolver algo. Si no lo hace, constants contendrá efectivamente undefined. Una solución fácil sería devolver this, pero sería una mala solución porque está extendiendo this que es una instancia de un objeto que no le pertenece.

Así devolver un objeto en línea parece ser la solución a este problema:

var constants = (function() { 
    var millisecs = 1000, 
     defaultMsgsPerSecond = 60; 
    return { 
     getMillisecs: function() { return millisecs; } 
     getDefaultMsgsPerSecond: function() { return defaultMsgsPerSecond; } 
    }; 
})(); 
4

En EcmaScript 6, usted será capaz de hacer sólo:

const MILLISECS = 1000; 
const DEFAULT_MSG_PER_SECOND = 60; 

Pero hasta entonces, puede utilizar EcmaScript de 5 Object.freeze:

var constants = { 
    millisecs: 1000, 
    defaultMsgPerSecond: 60 
}; 

var constants = Object.freeze(constants); 

// Now constants is in fact... a constant! 
constants.millisecs = 999; 
constants.millisecs; // Still === 1000 

Y si es su naturaleza ser prolijo, puede intentar Object.defineProperties:

var constants = {}; 

Object.defineProperties(constants, { 
    'millisecs': { 
     value: 1000, 
     writable: false 
    }, 
    'defaultMsgPerSecond': { 
     value: 60, 
     writable: false 
    }, 
}); 

// Again, constants is in fact... a constant! 
constants.millisecs = 999; 
constants.millisecs; // Still === 1000 
Cuestiones relacionadas