2012-08-21 7 views
7

JSHints Inspektionen, die jetzt in PHPStorm integriert sind, informierten mich über JavaScript-magische Zahlen und ich merke, dass klarer Code verwendet wird, um sie zu vermeiden.Vermeiden von magischen Zahlen in JavaScript - Alternativen, die mit JsHint funktionieren

Ich habe versucht, dieses:

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

und auch dieses:

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

JsHint beide beklagt.

Einnahme der Lösung aus this answer obwohl funktioniert gut:

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

Vermutlich wegen der Schließung. Warum wird das akzeptiert, während die anderen beiden Vorschläge, die aus einer anderen SO-Frage stammen, nicht sind?

Edit: Obwohl es keinen Fehler auslöst, funktioniert es nicht wirklich. Es ist falsch zu sagen, dass Konstanten nicht definiert sind. JsFiddle.

Um zu klären - von "Werken" meine ich "löst keine Warnung aus JsHint"

+0

Ein Problem mit Ihrem ersten beiden Codebeispielen deutlich erscheinen, aber in der zweiten Codebeispiel fehlt, ist, dass die „Konstanten“ sind nicht so konstant - das heißt, kann später im Code geändert werden (mit 'Konstanten .millisecs = 100; '). – penartur

+0

@penartur das scheint mir die Antwort zu sein - das Arbeitsbeispiel nennt sich sofort selbst, macht seine Eigenschaften privat und damit sind nur die beiden Getter exponiert? – bcmcfc

+0

@ Wouter-Huysentruit bitte könnten Sie Ihren Schnitt erklären? – bcmcfc

Antwort

3

über Ihren bearbeiten

Ich glaube, Sie zu new das Inline-Objekt gesucht:

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

Aber JSHint wird auch darüber beschweren: Weird construction. Is 'new' unnecessary?.

Wenn Sie es als eine Schließung verwenden, müssen Sie tatsächlich etwas zurückgeben. Wenn Sie dies nicht tun, wird constants tatsächlich undefined enthalten. Eine einfache Lösung wäre, this zurückzugeben, aber das wäre eine schlechte Lösung, weil Sie this erweitern, die eine Instanz eines Objekts ist, das Sie nicht besitzen.

ein Inline-Objekt So Rückkehr scheint hier die Lösung zu sein:

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

In EcmaScript 6, werden Sie in der Lage sein, genau das zu tun:

const MILLISECS = 1000; 
const DEFAULT_MSG_PER_SECOND = 60; 

Aber bis dahin können Sie verwenden EcmaScript 5s 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 

Und wenn es Ihre Natur ist weitschweifig zu sein, können Sie Object.defineProperties versuchen:

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 
Verwandte Themen