我试图理解Express JS源代码,这是表达导出的主要模块
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;
}
我对这段代码感到困惑
var app = function(req, res, next) {
app.handle(req, res, next);
};
变量app
在函数内同时分配和使用。这怎么办?其他任何地方都没有app
的定义。找到真正的来源here。
答案 0 :(得分:2)
创建函数并将其分配给app
变量。这是一个正常的函数表达式赋值。
然后,两个mixin()
行向app
函数添加方法。因此,在调用这些函数后,它会有app.handle()
和app.init()
等内容。
然后,又添加了两个属性app.request
和app.response
。
然后,调用app.init()
。
然后,稍后调用app
函数(当http请求到达时),并且在调用它时,它调用app.handle()
,它只调用一个属于自身属性的函数。这都是合法的。它类似于在更传统的对象中调用this.handle()
。
这是一个似乎让你最困惑的部分的小演示:
var test = function() {
test.doSomething();
}
test.doSomething = function() {
console.log("doSomething");
}
test(); // causes test.doSomething() to get called