2012-08-21 8 views
7

Le ispezioni di JSHint ora incorporate in PhpStorm mi hanno informato dei numeri magici JavaScript e mi rendo conto che renderà il codice più chiaro per evitare di utilizzarli.Evitare l'uso di numeri magici in JavaScript - alternative che funzionano con JsHint

ho provato questo:

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

e anche questo:

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

JsHint lamenta entrambi.

Prendendo la soluzione da this answer però funziona bene:

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

presumibilmente a causa della chiusura. Perché questo è accettato, mentre gli altri due suggerimenti presi da un'altra domanda SO non lo sono?

Modifica: Sebbene non si verifichi un errore, in realtà non funziona. Errori dire che le costanti non sono definite. JsFiddle.

Per chiarire - per "opere" Voglio dire "non si innesca un avvertimento da JsHint"

+0

Un problema che appare in modo chiaro con i primi due esempi di codice, ma manca l'esempio di codice quest'ultimo, è che i "costanti" non sono così costanti - cioè, possono essere modificate in seguito nel codice (con 'costanti .millisecs = 100; '). – penartur

+0

@penartur che mi sembra la risposta - l'esempio di lavoro si chiama immediatamente, rendendo le sue proprietà private e quindi solo i due getter sono esposti? – bcmcfc

+0

@ Wouter-Huysentruit, per favore potresti spiegare la tua modifica? – bcmcfc

risposta

3

sulla tua modifica

penso che si voleva new l'oggetto in linea:

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

Ma JSHint si lamenterà anche di questo: Weird construction. Is 'new' unnecessary?.

Se lo si utilizza come chiusura, è necessario restituire effettivamente qualcosa. In caso contrario, constants contiene effettivamente undefined. Una soluzione semplice sarebbe quella di restituire this, ma sarebbe una soluzione sbagliata perché stai estendendo this che è un'istanza di un oggetto che non possiedi.

Così restituzione di un oggetto in linea sembra essere la soluzione qui:

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

In EcmaScript 6, sarete in grado solo fare per:

const MILLISECS = 1000; 
const DEFAULT_MSG_PER_SECOND = 60; 

Ma fino ad allora, è possibile utilizzare di EcmaScript 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 

E se è la vostra natura di essere prolisso, si può provare 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 
Problemi correlati