6

私は中級レベルのJavaScript開発者であり、優れたJavaScript開発者がコードを作成する方法を理解しようとしています。そして、出発点としてBackboneライブラリーの調査を開始することにしました。

これがバックボーンの初期設定のコードスニペットです。それを理解するのを手伝ってください。

code1- _

(function(){
   var root = this;
}).call(this);

単に()を使用するよりもcallメソッドを使用する特定の理由がありますか、それとも単なるコーディング設定です。同じコードを作成する必要がある場合は、次のようにします。

(function(root){

})(this);

code2- _

  var Backbone;
  if (typeof exports !== 'undefined') {
    Backbone = exports;
  } else {
    Backbone = root.Backbone = {};
  }

現在、グローバルスコープにはエクスポートの定義がなく、ローカルスコープのどこにも定義されていません。同じコードを記述している場合、ブロックがここで実行されているとしたらどうなりますか。

  var Backbone = root.Backbone = {};

コード3

var _ = root._;
if (!_ && (typeof require !== 'undefined')) _ = require('underscore')._;

繰り返しますが、ローカルまたはグローバルスコープのどこにもrequireの定義が見つかりません

4

4 に答える 4

6

コードブロック1

これは開発者の好み次第です。どちらの方法でもそのコードを書くことができ、実際、多くのライブラリは提案されたスタイルを好みます。

コードブロック2

このブロックは、AMDボイラープレートのテイクです。AMDライブラリは、 JavaScriptコードをモジュールに分割するために必要なフックを提供します。コードブロックの場合、オブジェクトはCommonJSModuleStandardexportsによって使用されるグローバルです。グローバルが存在しない場合、バックボーンはオブジェクトに直接追加されます。exportsroot

これに関する興味深い補足事項は、Backboneが人気のあるRequireJSAMDライブラリへのエクスポートをサポートしていないという事実です。

コードブロック3

requireAMDライブラリによって導入されたもう1つのグローバルです。上記を参照してください。

于 2012-08-16T09:55:33.460 に答える
2

code1ではcall(this)電流の参照をthis関数に渡します。グローバルスコープで行う場合は、thisですwindow。それは単なる好みであり、その場合は違いはないと思います。

requireexportsNodeJS(またはCommonJS準拠のライブラリ)によって提供され、CommonJS仕様の一部です。

于 2012-08-16T09:44:40.210 に答える
0

コード2は、他の誰かがグローバルスコープでエクスポートを定義した場合に備えてフレームワークを保護するためのものだと思います。したがって、彼らはそれが未定義ではないかどうかをチェックし、他の誰かが行ったことを意味し、それを空のオブジェクトにリセットするだけです。

于 2012-08-16T09:42:54.237 に答える
0

@JonnyReevesは、ほとんどすべての質問に答えています。以前にbackbone.jsの注釈付きソースコードを見たことがあるかどうかはわかりませんが、これは役に立ちます。

http://documentcloud.github.com/backbone/docs/backbone.html

于 2012-08-17T05:52:46.210 に答える