节点模块 - 导出变量与导出引用它的函数?

时间:2011-09-11 22:45:38

标签: javascript node.js module

最容易用代码解释:

##### module.js
var count, incCount, setCount, showCount;
count = 0; 

showCount = function() {
 return console.log(count);
};
incCount = function() {
  return count++;
};
setCount = function(c) {
  return count = c;
 };

exports.showCount = showCount;
exports.incCount = incCount;
exports.setCount = setCount; 
exports.count = count; // let's also export the count variable itself

#### test.js
var m;
m = require("./module.js");
m.setCount(10);
m.showCount(); // outputs 10
m.incCount();  
m.showCount(); // outputs 11
console.log(m.count); // outputs 0

导出的函数按预期工作。但我不清楚为什么m.count也不是11。

3 个答案:

答案 0 :(得分:14)

exports.count = count

您在对象count上设置属性exports,使其成为count的值。即0

一切都是通过价值而不是通过参考传递。

如果你要将count定义为这样的吸气剂:

Object.defineProperty(exports, "count", {
  get: function() { return count; }
});

然后exports.count将始终返回count的当前值,因此为11

答案 1 :(得分:0)

如果我错了,请纠正我,但数字是不可变的类型。当您更改count的值时,您的参考也会更改。因此exports.count引用旧的count值。

答案 2 :(得分:0)

在JavaScript中,函数和对象(包括数组)通过引用分配给变量,字符串和数字按值分配 - 即通过制作副本。如果var a = 1var b = a以及b++a仍然等于1。

在这一行:

exports.count = count; // let's also export the count variable itself

你制作了count变量的副值副本。 setCount(),incCount()和showCount()操作都对闭包内的count变量进行操作,因此m.count不再被触及。如果这些变量在this.count上运行,那么你会得到你期望的行为 - 但你可能不想导出计数变量。