2

Javascript の変数スコープについて質問があります。さまざまなタイミングで読み込まれる Web ページに一連のスクリプトがあります。たとえば、それらすべてにアクセスできるようにするには、MyVar というグローバル オブジェクトが必要です。再定義は避けたいのですが、最初のスクリプトでどこかで定義する必要があると思います。私の質問はvar MyVar = MyVar || {}、ソリューションを使用していますか?

ありがとう

 /**
 * Script 1
 */


var MyVar = MyVar || {};
MyVar.config = {
    x : 2,
    y : 3
};


/**
* Script 2
*/

//is this correct?
var MyVar = MyVar || {};
//to which MyVar am I assigning the apple property?
MyVar.apple = 'red';

アップデート

これまでのところ素晴らしい答えです。みんなありがとう。

最後の部分ですが、2 回目の var ステートメントは何をvar MyVar = MyVar || {};しているのでしょうか? MyVar既存の値が割り当てられているというグローバルスコープに新しい変数を作成していMyVarますか?

他の投稿者は、私がこれらのスクリプトを<script>タグで同期的にロードしていると仮定するのが正しいですが、分業のためにスクリプトを作成し、いつ、どのようにロードするかを制御しないため、MyVarオブジェクトを作成/利用するための絶対確実な方法が必要です。

ありがとう

4

4 に答える 4

2

あなたのコードは正しく、おそらく期待どおりに動作しますが、MyVar作成されるスコープに注意してください。ファイルが投稿されていると仮定すると、スコープMyVar内で作成されます (ブラウザーのコンテキストを想定)。windowそれらの 1 つが無名関数でラップされている場合、Module Patternで一般的に行われてMyVarいるように、その関数のスコープ内でのみ作成されます。

(function() {
    var MyVar = MyVar || {};
    // If MyVar doesn't already exist in the global context,
    // the current MyVar reference will only be scoped to this function.
})();

使用するより良いパターンは次のとおりです。

var MyVar = window.MyVar || (window.MyVar = {});

これにより、常にグローバル スコープから作成および参照されるようになります。将来のリファクタリングを容易にするために、コンテキストを渡すこともできます。

(function(context) {
    var MyVar = context.MyVar || (context.MyVar = {}));
})(window);
于 2013-01-10T23:42:09.183 に答える
2

異なる時間に読み込まれる Web ページに一連のスクリプトがあります

それらのいずれかが非同期でロードされていますか? 一連の<script>タグの場合は、順番に同期して読み込まれます。

Apple プロパティをどの MyVar に割り当てていますか?

MyVar毎回グローバル スコープで宣言すると、 は 1 つだけになりますMyVar。プロパティは、apple存在する場合は既存の変数に作成され、存在var MyVar = MyVar || {};しない場合は で作成された空のオブジェクトに作成されます。

結論: 最初の の後var MyVar = MyVar || {};、次の宣言は無視され、新しいプロパティが既存の変数に追加されます。既存のプロパティを上書きしないように注意してください。

于 2013-01-11T00:12:50.170 に答える
1

これは簡単にテストできます。

var MyVar = MyVar || {};
MyVar.config = {
    x : 2,
    y : 3
};

console.log(MyVar);

var MyVar = MyVar || {};
MyVar.apple = 'red';

console.log(MyVar);
于 2013-01-10T23:38:37.140 に答える
0

これは私がそれを行う方法です:

window.myVar||(window.myVar={});

このようにして、変数が既に存在する場合、変数を再宣言しません。

于 2013-01-11T00:34:09.367 に答える