当需要express时,它是一个函数还是一个对象?

Luk*_*gen 1 javascript node.js express

当我将express引入我的项目并创建一个新的express应用程序时,我从这两行代码开始

var express = require('express');
var app = express();
Run Code Online (Sandbox Code Playgroud)

在我看来,这就像express一个返回app我创建的对象的函数。但后来我能够使用express.static()这让我认为这express是一个带有方法的对象static

app.use(express.static('public'));
Run Code Online (Sandbox Code Playgroud)

当我需要它时express,它似乎记录一个对象,所以我很好奇express()如果它是一个对象,如何返回某些东西?我最后的猜测是express是一个函数,但是因为这是javascript,函数是对象并且它也可以有属性?其中任何一个接近准确吗?

rsp*_*rsp 9

两个都。它是一个函数,也是一个对象——不仅在某种意义上,JavaScript 中的每个函数都是一个对象。它实际上定义了一些自定义属性,例如express.static,可以像普通对象一样使用它。

为了演示它,假设您有一个简单的模块,它导出一个像 Express 这样的函数

'use strict';
function x() {
    return 'x';
}
x.a = 1;
x.b = 'b';
x.c = () => 'c';
x.d = {a: 1, b: 2, c: 3};
module.exports = x;
Run Code Online (Sandbox Code Playgroud)

现在,当您需要模块时,例如

var x = require('./x');
Run Code Online (Sandbox Code Playgroud)

你可以做:

console.log( x() );
Run Code Online (Sandbox Code Playgroud)

但是也:

console.log( x.a );
console.log( x.b );
console.log( x.c() );
console.log( x.d.a );
Run Code Online (Sandbox Code Playgroud)