3

私は JS 構文をよりよく把握しようとしていますが、同じ名前の変数が既に宣言されている後にオブジェクト名を繰り返すことが多くのライブラリで一般的に行われているのはなぜだろうかと思っていました。下記を参照してください:

var Backbone = Backbone || {};    // <= Why the duplication?

また

var listeners = this._listeners || (this._listeners = {});

アップデート:

さらに調査した結果、多くの慣用表現を評価する非常によく書かれた記事を見つけました。

この記事では、Immediately Invoked Function Expressions (IIFE) の背後での使用、つまり次のような関数内での関数のラッピングについても説明しています。

(function() {
  console.log('Hello!');
})();

これは、私のような初心者にはまったく理解できない JS の頭の体操の 1 つです。

4

3 に答える 3

9
var Backbone = Backbone || {};

Backboneundefinedまたはnullまたはの場合false、に設定することを意味します{}


より長い説明:

代入演算子からに評価され、論理演算子(Javascript にはブール値以外のオペランドでも機能するため、実際の論理演算子はありませんが) はからに評価されます。

のような式は、、 、またはの場合にA || B返します。BAundefinednullfalse

したがって、すでに値がある場合は値A = A || Bを保持するか、に割り当てます。ABA

于 2013-04-25T12:39:57.910 に答える
0
var Backbone = Backbone || {};

他の人が説明したように、このコードは次のことを行います。

  • 変数 Backbone を宣言し、変数 Backbone がスコープ内に既に存在するかどうかを確認します。
  • はいの場合、そのオブジェクト (JS ではすべてがオブジェクト) を宣言された変数 (ちなみに、同じ名前を持つ) に割り当てます。
  • いいえの場合、新しい空のオブジェクトが作成されます。

これの目的はモジュール性です。裸の Backbone とともに、いくつかの Backbone プラグインをロードしているとしましょう。

  • まず、ベース バックボーンをロードしました。
  • スクリプトは、ルート スコープ オブジェクトがルート スコープ オブジェクト バックボーン (つまり、window.Backbone) が存在するかどうかをチェックするかどうかをチェックします。
  • そうではないので、空のものを作成し、それを処理します。
  • 次のプラグイン スクリプトは、ルート オブジェクト Backbone が存在するかどうかをチェックします (存在します)。
  • 存在するため、新しい空のオブジェクトを作成せず、既存のオブジェクトを使用します
  • すべてのプラグインがロードされるまで、このようになります。

これは完全に正しいわけではありませんが、このようなことが起こります。

于 2013-04-25T12:59:21.447 に答える
-1

これは、変数がまだ割り当てられていない場合にのみ、変数の値をデフォルトにする方法です。オプションの関数パラメーターをデフォルト値で実行する JS の方法と考えることができます。

于 2013-04-25T12:40:45.050 に答える