1

この HTML ページを取得しました。共通の変数を持つ 2 つの JavaScript ファイルから変数にアクセスしたい。それぞれの JavaScript に関連するこれらの変数から値を取得する必要があります。を使用してロードしようとしまし<script>たが、js 変数にアクセスすると、最後の js ファイルからのみ値が取得されます。つまり、最後にロードされた js ファイルが変数値を上書きし、これらの値のみがアクセス可能になります。これについて助けていただければ幸いです。

ありがとう!!!

4

3 に答える 3

6

変数に名前を付けるか、別の名前の変数を使用する必要があります。あなたがしているように聞こえるのは、次のものと同等です。

var x = 'foo';
var x = 'bar';

console.log(x);

    > bar

これは理にかなっているはずです。ただし、名前空間を使用すると、うまく機能します。2 つのファイルを考えてみましょscript-1.jsscript-2.js

// script-1.js
var s1 = {
    x:'foo'
}

// script-2.js
var s2 = {
    x:'bar'
}

...それから...

console.log(s1.x);

    > foo

console.log(s2.x);

    > bar

もちろん、これはかなり陳腐な例です。

編集

ファイル自体を変更できない場合は、次のようにします。script-1 をロードした後、script-2 をロードする前に、値を別の名前/オブジェクトに保存します。

<script type="text/javascript" src="script-1.js"></script>

<script type="text/javascript">
    var s1 = {
        // Save off values here
        x:x,
        y:y
    }
</script>

<script type="text/javascript" src="script-2.js"></script>

// Then...
console.log(s1.x);  // will output the value from script-1.js
console.log(x);     // will output the value from script-2.js

きれいではありませんが、うまくいくはずです。

于 2013-01-14T22:17:44.587 に答える
2

変数が衝突していることが問題であり、それらの値を個別に維持したい場合は、各ファイルのコードをクロージャーでラップする必要があります。ここでは、即時呼び出し関数式パターンを適用できます。

(function() {
    // your code here
    // all of it!
}());

これにより、グローバル変数が完全に防止されます。ファイル間で何も共有する必要がない場合は、これが適しています。

共有グローバルを作成する必要がある場合は、次のように宣言します。

var x = x || {}; // empty object as an example value

各ファイルの先頭でそれを行います。x が新しい場合、宣言されます。すでに宣言されている場合は、以前の値が保持されます。

グローバル変数を減らす簡単な方法として、名前空間を使用して同じことを行うことを強くお勧めします。

var APP = APP || {};

APP.x = APP.x || {}; // example property of APP, in this case initializing an object

いつでもテクニックを組み合わせることができます。クロージャーの外側で名前空間オブジェクトをセットアップし、それらにアクセスします。このようにして、1 つのグローバルのみを公開し、他のすべてのスコープを制限します。

それが役立つことを願っています!

于 2013-01-14T22:43:05.247 に答える
0

JavaScript ファイルをある程度制御できる場合、Madbreak の答えはそのとおりです。JavaScript ライブラリを定義するときはいつでも、衝突を避けるために匿名関数と名前空間を使用する必要があります。

ただし、それ以外の場合は、それらを非同期にロードしeval、一度に 1 つずつロードすることができます (これを行うためのより邪悪な方法があるかもしれませんが、私はそれを認識していません) - そうすれば、ダウンロードのコールバックで最初のものを使用できます秒で上書きされる前に。ただし、両方が長期的に必要な場合は、運が悪いかもしれません.

一方を他方の前に実行する必要がある場合は、最初のダウンロードのコールバックで2 番目をロードする必要があることを覚えておいてください(非同期処理を行わない限り、どこでも問題ありません)。そうしないと、競合状態になります。どちらが最初に行きます。

于 2013-01-14T22:33:48.943 に答える