8

PhpStorm に組み込まれた JSHint のインスペクションは、JavaScript のマジック ナンバーについて教えてくれました。

私はこれを試しました:

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

そしてこれも:

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

JsHint は両方について文句を言います。

この回答から解決策を取るとうまくいきます:

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

閉店のせいかな。別のSOの質問から取られた他の2つの提案が受け入れられないのに、これが受け入れられるのはなぜですか?

編集:エラーは発生しませんが、実際には機能しません。定数が未定義であると言うのは誤りです。Jsフィドル

明確にするために-「機能する」とは、「JsHintから警告をトリガーしない」ことを意味します

4

2 に答える 2

6

EcmaScript 6 では、次のことができるようになります。

const MILLISECS = 1000;
const DEFAULT_MSG_PER_SECOND = 60;

しかしそれまでは、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

そして、あなたの性質が冗長である場合は、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
于 2014-07-07T17:33:45.050 に答える
4

あなたの編集について

newインラインオブジェクトが欲しかったと思います:

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

しかし、 JSHint もそれについて不平を言うでしょう: Weird construction. Is 'new' unnecessary?.

クロージャーとして使用する場合は、実際に何かを返す必要があります。そうしないと、constants実際に含まれますundefined。簡単な修正は を返すことですが、所有していないオブジェクトのインスタンスをthis拡張しているため、これは悪い解決策になります。this

したがって、ここではインライン オブジェクトを返すことが解決策のようです。

var constants = (function() {
    var millisecs = 1000,
        defaultMsgsPerSecond = 60;
    return {
        getMillisecs: function() { return millisecs; }
        getDefaultMsgsPerSecond: function() { return defaultMsgsPerSecond; }
    };
})();
于 2013-10-30T19:01:17.477 に答える