无法理解这个Express JS源代码片段

时间:2017-10-06 04:31:02

标签: javascript node.js express

我试图理解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

1 个答案:

答案 0 :(得分:2)

创建函数并将其分配给app变量。这是一个正常的函数表达式赋值。

然后,两个mixin()行向app函数添加方法。因此,在调用这些函数后,它会有app.handle()app.init()等内容。

然后,又添加了两个属性app.requestapp.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