3

重複の可能性:
「var FOO = FOO || {}" は Javascript で意味しますか?
Javascript - 変数宣言に条件を追加できますか

これは、スコープの再定義ではなく、スコープの設定に関係していると思います。これは、一般的な JavaScript フレームワークでよく見られます。

var something = something || {};

トップレベルの変数を誤って再定義しないことと関係がありますか?

4

8 に答える 8

5

あなたは正しいです。変数が既に存在する場合 (私たちのものであろうとなかろうと)、それを変更しないでください。存在しない場合は、新しく作成しましょう。

于 2012-08-27T17:03:04.293 に答える
3

var something = something || {};

設定できないパラメーターを持つ関数内で使用できます

    function doStuff( arg1, arg2, arg3 ) {
        arg2 = arg2 || {};
        arg3 = arg3 || arg1 + 2;
    };

これにより、関数 doStuff を呼び出すときに、2 番目と 3 番目の引数がオプションになります。

于 2012-08-27T17:06:57.053 に答える
2

これにより、ローカル スコープを持つ新しいオブジェクトが作成されます。外側somethingが null、false、または未定義 (または false) の場合、新しい変数は空のオブジェクトになります{}

于 2012-08-27T17:03:54.023 に答える
2

スコープを再定義するのではなく、変数が既存のスコープ内に存在することを確認するだけです。割り当てステートメントは次のように読むことができます。

something存在する場合 (およびundefinednull0またはfalseが設定されsomething = somethingていない (つまり、何もしない)。存在しない場合は、それを作成し、空のオブジェクト リテラルと等しくなるように設定します。」

于 2012-08-27T17:04:56.130 に答える
2

この構造は、既存のデータを上書きしないために非常に便利です。複数の Javascript ファイルを扱っていて、あるオブジェクトのデータを共有したいとしましょう。

a.js

var share = window.share = share || { };
share.thisIsA = true;

b.js

var share = window.share = share || { };
share.thisIsB = true;

2 つ以上のファイルがあり、それらのファイルを非同期的にロードする場合 (順序は保証できません)、そのグローバルshareオブジェクトが以前に定義されて入力されていれば、そのグローバル オブジェクトを上書きしません。これは、名前空間オブジェクトまたは構成オブジェクトの非常に一般的な方法です。

もう 1 つの非常に一般的な使用例は、デフォルト値の作成です。例えば

function foo( option ) {
    option = option || 'something';

    if( option === 'foobar' ) {} // ...
}

そこでは、関数が引数なしで呼び出された場合に、パターンを使用して、オプション引数に少なくとも 1 つの既知の定義済みの値を設定します。たとえば、プラグイン コードで非常によく見られます。

于 2012-08-27T17:06:38.927 に答える
2

これは、次のことと同じです。

var something = ( something ) ? something : {};

( something )真または偽の値の評価はどこにありますか。truey (something存在する) 場合は、それ自体に等しいか、そうでない場合は空のオブジェクトになります。

于 2012-08-27T17:07:14.807 に答える
0

JavaScript の OR コンストラクターは、この関数に近いです。

function or(a, b)
{
  if(a) return a;
  else return b;
}

"a" が true と評価された場合、"b" もチェックしません (実行もしませんが、関数の場合ではありません)。さらに、boolean に変換せずに純粋な "a" を返します。非ブール変数の構築 "ORed"は、ブール true に変わる最初のものに評価されます。何かをサポートできない場所で広く使用されています。

var functionDoingSomethingCrossBrowser = functionOnMsie 
                                      || functionEverywhereElse;

これを (新しいオブジェクト) 演算子と組み合わせると{}、「何か」がスコープ内で利用できない場合 (ほとんどの場合、未定義であり、false と評価されます)、変数が空のオブジェクトで埋められます。

于 2012-08-27T17:12:38.117 に答える
0

何かを吊るすことができるオブジェクトであることを保証しているように見えます。デフォルトの設定。

var 何かを呼び出すか、関数のパラメーターとして設定すると、そのスコープ内の何かのすべてのインスタンスが新しい変数になり、より高いスコープのインスタンスにアクセスできなくなります。

(function() {
  var something = 'foo';

  (function() {
    var something = something || 'bar';

    console.log(something);
  })();

  console.log(something);
})();

出力します

'bar'
'foo'
于 2012-08-27T17:09:11.883 に答える