我正在阅读Node.js Connect 2.15.0版本:
/**
* Create a new connect server.
*
* @return {Function}
* @api public
*/
function createServer() {
function app(req, res, next){ app.handle(req, res, next); }
utils.merge(app, proto);
utils.merge(app, EventEmitter.prototype);
app.route = '/';
app.stack = [];
for (var i = 0; i < arguments.length; ++i) {
app.use(arguments[i]);
}
return app;
};
几个问题:
app.handle
似乎在proto中提供,因为在proto.js中定义了app.handle
。所以,这是一个闭包的使用,app.handle
不是在Node解析function app()
的时候定义的,而是在代码的后面定义的?app
本身也定义在... uh.中。function app()
.代码对我来说似乎很有趣。
1.什么时候调用function app()
?我只知道创建服务器会创建服务器。那么我什么时候调用这个函数呢?我做了一些像:
app = createServer()
app.listen(3000)
app(req, res, next)
- utils.merge()简单地说
exports.merge = function(a, b){
if (a && b) {
for (var key in b) {
a[key] = b[key];
}
}
return a;
};
这是一个常见的做法,而不是继承或什么?我看是mixin
。
1条答案
按热度按时间scyqe7ek1#
app.handle
似乎在proto中提供,因为在proto.js中定义了app.handle
。所以,这是一个闭包的使用,app.handle
不是在Node解析function app()
的时候定义的,而是在代码的后面定义的?app
本身也定义在... uh.中。function app()
.代码对我来说似乎很有趣。app.handle
来自proto
。但是不,在app
函数中访问app
不是闭包,函数在所有函数声明中都可以通过其名称获得。2.什么时候调用
function app()
?我只知道createServer
创建了服务器。那么我什么时候调用这个函数呢?connect docs使用以下示例代码:
您可以看到
connect
(您发布的createServer
函数)确实创建了app
,它作为处理程序传递给实际的http服务器。3.
utils.merge()
是代替继承的常见做法吗?我看是mixin
。是的,
merge
确实将一个对象混入另一个对象。这样做是为了用所有必要的方法扩展函数对象app
。这是必要的,因为不可能以标准的方式Define a function with a prototype chain。他们可能也使用了类似的方法:但
app
就不再是instanceof Function
了并且没有函数方法。