0

重複の可能性: JavaScript でグローバル変数を回避するには?

JavaScript でグローバル変数を管理する最善の方法についてアドバイスを求めています。

次の点を考慮してください。

foo = 1;
bar = 2;

// Update our global variable
function doStuff (newFooValue) {
    foo = newFooValue
}

// Update a global based on a condition
function doMoreStuff () {
    if (bar == 3) {
        foo = 1;
    }
}

どちらの場合も、私たちの関数は内部的にグローバル変数にアクセスしていますが、これは私には醜く感じられます。私が読んだことによると、グローバル名前空間が詰まるのを避けるために、可能な限りグローバルを避けたいと考えています。

では、グローバルの構造を作成するだけで十分でしょうか?

例えば、

var myPage = {}
myPage.foo = 1;
myPage.bar = 2;

これでグローバル名前空間の競合の問題は解決すると思いますが、メソッド内からグローバル スコープにアクセスしています。

私は何をすべきか?

4

2 に答える 2

3

グローバルな名前空間の汚染を回避するには、コードをImmediate Invoked Function Expression (IIFE)でラップする必要があります。JavaScript 変数には関数スコープがあるため、宣言されている関数内にのみ存在します。

(function () {
    //these variables only exist within the outer function
    var foo,
        bar;
    foo = 1;
    bar = 2;

    //these functions only exist within the outer function
    function fizz() {
        return foo + bar;
    }
    function buzz() {
        return foo - bar;
    }
}());

上記の例は、すべての変数と関数がカプセル化されており、外部から使用できないため、まったく役に立ちません。グローバルにする必要がある関数/変数は、手動でグローバル オブジェクトに追加する必要があります。

(function (g) {
    //not repeating code from above, pretend it's here

    //make the functions globally accessible
    g.fizz = fizz;
    g.buzz = buzz;
}(this));
于 2013-01-12T19:15:26.847 に答える
0

おそらくクラスでラップしますか?

var myPage = {}
myPage.foo = 1;
myPage.bar = 2;
myPage.doStuff = function(newFooValue) {
    this.foo = newFooValue;
}

その場合、グローバル スコープで 1 つのスポットを使用するだけです。これは避けるべきですが、グローバル スコープに対処する必要がある場合は、それを行います。設計パターンについて質問している場合は、より正確にする必要があります。doStuff と doMoreStuff という名前の 2 つの関数がある場合、設計は非常に困難です。

于 2013-01-12T19:19:40.413 に答える