2017-10-06 9 views
1

このエクスプレスJSソーススニペットを理解し、これはExpressは、私は、コードカントは、私はエクスプレスJSのソースを理解しようとしていた

var app = function(req, res, next) { 
    app.handle(req, res, next); 
    }; 

のこの作品について混乱しています

module.exports = createApplication; 


function createApplication() { 
    var app = function(req, res, next) { 
    app.handle(req, res, next); 
    }; 

    mixin(app, EventEmitter.prototype, false); 
    mixin(app, proto, false); 

    // expose the prototype that will get set on requests 
    app.request = Object.create(req, { 
    app: { configurable: true, enumerable: true, writable: true, value: app } 
    }) 

    // expose the prototype that will get set on responses 
    app.response = Object.create(res, { 
    app: { configurable: true, enumerable: true, writable: true, value: app } 
    }) 

    app.init(); 
    return app; 
} 

を輸出しているメインモジュールであります変数appが同時に割り当てられ、関数内で使用されます。これはどのように機能しますか?他の場所にはappの定義はありません。実際の情報源はhereです。

答えて

2

関数が作成され、変数appに割り当てられます。これは通常の関数式の割り当てです。

次に、2つのmixin()行がメソッドをapp関数に追加します。だから、これらの関数を呼び出した後、app.handle()app.init()のようなものがあります。

さらに2つのプロパティapp.requestapp.responseが追加されます。

次に、app.init()が呼び出されます。 (httpリクエストが到着したとき)

はその後、いつか後にapp関数が呼び出され、それが呼び出されたときに、それだけで、それ自体の性質である関数を呼び出しているapp.handle()を呼び出します。それはすべて合法です。これは、より伝統的なオブジェクトでthis.handle()を呼び出すのと同様です。

ここでは、最も混乱しているようだ一部の小さなデモです:

var test = function() { 
 
    test.doSomething(); 
 
} 
 

 
test.doSomething = function() { 
 
    console.log("doSomething"); 
 
} 
 

 
test(); // causes test.doSomething() to get called

+0

は、ああ。今は理にかなっている。ありがとう! –

関連する問題