为什么我们在javascript(节点)中需要的所有外部模块都是函数?

时间:2018-03-16 17:14:55

标签: javascript node.js

我导入了模块fs,lodash,yargs和express,然后在我需要的变量上使用了typeof。除了fs之外的所有变量都显示为函数

1)我可以理解它是否是一个对象,因为我们使用驻留在该模块中的函数,但所有模块都是函数对我来说没有意义(抱歉,如果它的声音很愚蠢)

2)

const express = require('express');
let app = express();

请您解释一下上面的代码片段(第二行)?我们可以在变量中存储一个执行函数吗?我们在应用程序或整个函数中存储express的返回值,我们进一步使用像app.get()这样的函数就像一个对象

第二点与第一点有关,如果有人可以向我解释,那将会非常有用 谢谢

2 个答案:

答案 0 :(得分:1)

JavaScript是一种与Java等其他人不同的编程语言,也许这让您感到困惑。相反,它受到了Scheme的启发。

在JavaScript中,函数是一等公民,这意味着它们可以像任何其他对象一样拥有属性和方法,并且可以像任何对象一样传递和分配它们。请参阅示例https://developer.mozilla.org/en-US/docs/Glossary/First-class_Function以获取对第一类函数的介绍,或参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions以获取JavaScript函数的简介。

这是JavaScript中的核心概念,因此您可能希望了解一些入门书籍以正确掌握语言基础知识。

关于代码:

const express = require('express');
let app = express();

第一行是将一个函数存储到"变量",实际上是一个常量,表达:express=require('express');

然后,我们可以使用"变量"的名称来调用这样的函数。 (或常数)它存储:express()

显然,之前的步骤只能通过JavaScript允许函数被视为"对象"

最后,我们可以照常将变量的调用结果存储在变量中:app = express();

答案 1 :(得分:0)

要回答第一个问题,这取决于您从模块导出的内容,要么导出多个值,要么只导出一个值。

例如,我创建了一个模块Math.js来使用sum和sub方法,我希望这个模块能够返回这些方法。

 const sum = function(a, b) {
   return a + b;    
 };
 const sub = function (a, b) {
   return a -b;
 };

 module.exports = {
  sum, 
  sub
 };

在代码文件中说app.js,我将按要求使用它:

const Math = require('./Math');
const sum  = Math.sum(10, 20);
const sub  = Math.sub(20, 10);
console.log('Sum: ', sum);
console.log('Sub: ', sub);

你知道,Math.js的目的是返回一个包含多个值的对象。

另一方面,假设我想为每个Math函数创建一个单独的模块。因此Sum.js如下:

module.exports = function(a, b) {
 return a + b;
};

和Sub.js如下:

module.exports = function(a ,b) { 
 return a - b;
};

现在在我的app.js文件中,我将使用以下两个模块:

const sum = require('./Sum');
const sub = require('./Sub');
console.log('Sum: ', sum(10, 20));
console.log('Sub: ', sub(20, 10));

所以在上面的例子中,我只是为每个模块提取一个方法。

在fs模块的情况下,它导出多个值,如果是express,则返回一个用于初始化express应用程序的函数。

为了回答你的第二个问题,首先要理解函数是第一类对象的概念,它意味着你可以对对象做任何事情,

  • 将其传递给其他函数作为参数
  • 从函数等返回函数
  • 将其存储到变量中,然后使用like variableName()等来调用它。

这就是为什么在示例代码中,express模块​​返回一个函数,该函数存储在表达式的常量中。然后在第二行,app变量初始化,其调用后的express函数的返回值是什么。

const express = require('express');
let app = express();