Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点模块-导出变量与导出引用它的函数?_Javascript_Node.js_Module - Fatal编程技术网

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

Javascript 节点模块-导出变量与导出引用它的函数?,javascript,node.js,module,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

最容易用代码解释:

##### 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

exports.count=count

在对象上设置属性
count
,将
导出为
count
的值。即0

一切都是按值传递,而不是按引用传递

如果将
count
定义为这样的getter:

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

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

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

在JavaScript中,函数和对象(包括数组)通过引用分配给变量,字符串和数字通过值分配——也就是说,通过复制。如果
var a=1
var 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上运行,那么您将获得预期的行为——但您可能无论如何都不想导出count变量。

不是所有的东西都是按值传递的!函数和对象总是通过引用传递。@zetlen否它们是通过值传递的。它们传递的值是对对象的引用。通过引用传递是指针。我们没有“通过引用”的指针。javascript中的这些指针在哪里?很公平。你会用什么来描述对象赋值/函数赋值和字符串赋值之间的区别?不,它不是一个文字内存位置,但对一个对象的两个引用将修改或显示同一个对象,而字符串则不是这样。你叫它什么?@zetlen,这篇文章简洁地回答了你的问题:。本质上,所有JavaScript函数都是按值传递的。有趣的问题是:它们传递了什么价值?对于基本类型,它是数据本身,对于非基本类型,它是实体的局部。谢谢,@Thierry!在我回答这个问题后的几年里,我逐渐理解了实际的引用应该是什么样子。重新指定对象的本地名称不会在函数体之外修改该名称的值,这在实际的传递引用语言中是会发生的——您正在接收一个引用,并且可以修改它。谢谢你的链接!