5

ページに同じスクリプトを何度もロードします。async/load 関数が原因で、Web サイトでどちらが最初に読み込まれるか、どちらが後に読み込まれるかを判断するのに問題があります。

そのため、スクリプトがロードされたときにそれらの順序をカウントするグローバル変数を配置したいと思います。

したがって、myScript.js は次のように始まります。

(function () {
    var privateNumberScriptLoaded;

    if (numberScriptLoaded === undefined) {
        numberScriptLoaded = 0;
    }
    else {
        numberScriptLoaded = numberScriptLoaded + 1;
    }

    privateNumberScriptLoaded = numberScriptLoaded;
    console.log(privateNumberScriptLoaded);
})();

しかし、私がそれをロードすると:

<script src="http://www.mywebsite.com/widget/myScript.js?type=normal" type="text/javascript"></script>
<script src="http://www.mywebsite.com/widget/myScript.js?type=rotation" type="text/javascript"></script>

私は(2回)を取得しnumberScriptLoaded is not definedます。

どうすればこの問題を解決できますか? 実際、存在しない場合は、Web サイトにグローバル変数を「作成」します。それをインクリメントして各スクリプトの「プライベート」変数に保存するよりも、各スクリプトの実行順序を保存できます。

4

7 に答える 7

10

現在、スクリプトはThe Horror of Implicit Globals の犠牲になっています。そうしないことをお勧めします。

次の 3 つのオプションがあります。

  1. すべてのグローバル変数は のプロパティとして終了するため、明示的にwindow使用できます。window

    if (!window.numberScriptLoaded) {
        window.numberScriptLoaded = 1; // 1, not 0
    }
    else {
        ++window.numberScriptLoaded;
    }
    

    window.プレフィックスのないコードとは異なり、ReferenceErrorオブジェクトのプロパティの検索は、独立した識別子の解決とは異なる動作をするため、 はスローされません。

    ライブデモ| デモページのソース| ロードするスクリプトのソース

  2. var numberScriptLoaded;スコープ関数の外など、常にスクリプト内のグローバル スコープに (初期化子なしで) 配置します。

    var numberScriptLoaded; // No initializer (no = 0 or anything)
    

    最初のロードで、これにより変数が作成されます。後続のロードでは、ノーオペレーションです。次に、なしでこれを行うことができますReferenceError

    if (!numberScriptLoaded) {
        numberScriptLoaded = 1; // 1, not 0
    }
    else {
        ++numberScriptLoaded;
    }
    

    ライブデモ| デモページのソース| ロードするスクリプトのソース

  3. を使用しtypeofます。typeof存在しない a 変数を取っても、 ReferenceError;は得られません。あなたが得る"undefined"。次に、プレフィックスを介して作成できます(したがって、 The Horror のwindow.餌食にならないようにします)。

    if (typeof numberScriptLoaded === "undefined") {
        // Assigning to window.numberScriptLoaded creates the global
        window.numberScriptLoaded = 1; // 1, not 0
    }
    else {
        ++numberScriptLoaded;
    }
    

    ライブデモ| デモページのソース| ロードするスクリプトのソース

于 2012-06-01T13:15:04.093 に答える
4

あなたは使用する必要がありますtypeof

if (typeof numberScriptLoaded === 'undefined') {
于 2012-06-01T12:47:37.477 に答える
2

試す

if ( 'undefined' === typeof numberScriptLoaded ) {
    numberScriptLoaded = 0;
} else {
    numberScriptLoaded = numberScriptLoaded + 1;
}
于 2012-06-01T12:48:10.813 に答える
1
myGlobalVar = typeof myGlobalVar == "undefined"? "New Value" : myGlobalVar;
myGlobalVar = typeof myGlobalVar == "undefined"? "Totally New Value" : myGlobalVar;
alert(myGlobalVar);

http://jsfiddle.net/8gnuwaah/2/

于 2015-11-18T23:07:22.163 に答える
0

グローバル変数はwindowオブジェクトの直接属性です。したがって、どこからでもグローバル変数を初期化したい場合は、次のように入力します。

window.variableName = "what_ever_you_want"
于 2012-06-01T12:50:13.850 に答える
0

ベスト プラクティスとして、またこの種のエラーを防ぐために、スクリプトで使用する前にすべての変数を初期化する必要があります。

あなたは置くべきです:

var numberScriptLoaded;

閉鎖の直前で、エラーは発生しません。

于 2012-06-01T12:55:33.960 に答える