哪个内存使用节点模块来保存数据?以及编译器如何知道它?节点模块如何工作?

时间:2015-09-29 08:33:32

标签: node.js math

我在node.js&中非常重要。堆栈溢出也。我正在阅读关于节点模块的内容,并且无法理解一些事情,比如我已经创建了一个节点模块,

math.js

var a = 10;    
module.exports = {    
    add: function (num) {    
        a += num;    
        return a;    
    }    
} 

然后我将这个math.js导出为以下两个文件

a.js

var math = require("./math.js");
var q = math.add(10);
console.log(q);

和 的 b.js

var math = require("./math.js");
var q = math.add(10);
console.log(q);

两者都为我提供了20& 20

但是当我加入这个a.js&另一个main.js文件中的b.js

main.js

var a= require("./a.js");
var b= require("./b.js");

它为我提供了20& 30。那么为什么它不提供20& 20?,它用于保存模块数据的内存?有人可以解释一下吗?

1 个答案:

答案 0 :(得分:0)

NodeJS中的模块处于“单例”模式。每个模块只创建一次,当您第二次调用require时,您只需获取上一个对象。

您的示例有一点解释:

<强> a.js

// Math is created
var math = require("./math.js");

// 10 is added to the interval variable a of math.js. so q is 20
var q = math.add(10);
console.log(q);

<强> b.js

// Math is created
var math = require("./math.js");

// 10 is added to the interval variable a of math.js. so q is 20
var q = math.add(10);
console.log(q);

现在很棘手:

<强> main.js

请允许我“重写”main.js的代码,我只需用自己的代码替换每个require

// ********************************************
// require('./a.js);
// Math is created, so the internal variable a is 10
var math = require("./math.js");

// 10 is added to the interval variable a of math.js. so q is 20
var q = math.add(10);
console.log(q);

// ********************************************
// require('./b.js);
// Math is not re-created here. NodeJS will re-use the previous result of require("./math.js");. So the internal variable a is still 20 here
var math = require("./math.js");

// 10 is added to the interval variable a of math.js. so q is 30
var q = math.add(10);
console.log(q);

你想要更棘手吗?就这样做:

require('./a.js');
require('./a.js');
require('./a.js');
require('./a.js');
require('./a.js');
require('./a.js');

此代码仅打印20次,仅打印一次。因为模块a将仅在第一次调用时创建。每次返回undefined(因为module.exports=...中没有a.js),但只有第一次才能执行其代码。