0

jade テンプレート エンジンのソース コードを参照していて、このステートメントの意味を理解しようとしています。

インスタンス化を試み、options.compilerそれが失敗した場合はインスタンス化しますCompilerが、次の部分で混乱します...これはparser.parse、戻り値を変数として呼び出して宣言することを言っていますか? もしそうなら、なぜ右端の括弧がオプションを囲んでいるのですか?

var compiler = new (options.compiler || Compiler)(parser.parse(), options)
  , js = compiler.compile();

.
それが役立つ場合、ここにいくつかのコンテキストがあります

function parse(str, options){
  try {
    // Parse
    var parser = new Parser(str, options.filename, options);

    // Compile
    var compiler = new (options.compiler || Compiler)(parser.parse(), options)
      , js = compiler.compile();

Github - ライン 960

4

3 に答える 3

2

var compiler = new (options.compiler || Compiler)インスタンス化 を試みませんoptions.compiler。のプロパティとしてコンストラクターの存在を探します。見つからない場合は、コンストラクターとして使用します。compileroptionCompiler

次に、これら2つの引数を使用されているコンストラクターに渡します。最初の引数はの戻り値でparser.parse()あり、2番目の引数はoptionsです。


簡単にするために、これは次のように書き直すことができます。

var theConstructor = options.compiler || Compiler;
var parsedStuff = parser.parse();
var compiler = new theConstructor(parsedStuff, options);
于 2013-01-25T05:13:32.513 に答える
1

分解してみましょう。

(options.compiler || Compiler)

この式は、「クラス」(技術的にはコンストラクター関数、これはJavaScriptです)を探すように設計されているようです。オプションオブジェクトを使用して指定することもできます。そうでない場合は、で参照されているものにフォールバックしCompilerます。

new (options.compiler || Compiler)(/* ... */)

さて、これはもっと理にかなっています。コンストラクターを呼び出しています。「クラス」が動的に選択されただけです。

new (options.compiler || Compiler)(parser.parse(), options)

コンストラクターに収入を与えるとき、2つのパラメーターを渡します。parse1つ目はオブジェクトのメソッドを呼び出した結果でparserあり、2つ目は以前のオプションオブジェクトです。

var compiler = new (options.compiler || Compiler)(parser.parse(), options)

その不潔な混乱はcompiler変数に保存されます。

var compiler = new (options.compiler || Compiler)(parser.parse(), options), js = compiler.compile();

同じステートメントで複数の変数を宣言して割り当てることができるvarため、さらに混乱する可能性があります。しかし、最後の部分はそれ自体でかなり理解しやすいです。

そのステートメントは、複数の行に分割される可能性があり、おそらくそうすべきです...しかし、それはそれが何であるかです。

于 2013-01-25T05:24:02.680 に答える
0

呼び出すコンストラクター自体が式であるため、面白そうに見えます。

parser.parse()いいえ、宣言されたローカルの値としては完全に計算されていませんがcompiler,、返されたオブジェクトから新しいオブジェクトを作成し、そこから初期化 compilerしています。

そして、その右端のパレンは、コンストラクターが返されることをコードが認識しているためです...2つのパラメーターが必要になります。

于 2013-01-25T05:15:30.657 に答える