我已经使用node.js几年了,并且一般认为我理解出口是如何运作的,但今天的边缘案例让我有些困惑。简化后的代码,表现如下:
a.js
var history = []
var i = 0
exports.updateHistory = function(){
history.push(i)
i++
if(history.length > 10){
history = history.slice(5)
}
}
exports.history = history
b.js
var a = require('./a')
setInterval(function(){
a.updateHistory()
console.log(a.history)
}, 200)
我希望其输出如下:
[ 0 ]
[ 0, 1 ]
[ 0, 1, 2 ]
[ 0, 1, 2, 3 ]
[ 0, 1, 2, 3, 4 ]
[ 0, 1, 2, 3, 4, 5 ]
[ 0, 1, 2, 3, 4, 5, 6 ]
[ 0, 1, 2, 3, 4, 5, 6, 7 ]
[ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
[ 5, 6, 7, 8, 9, 10 ]
[ 5, 6, 7, 8, 9, 10, 11 ]
[ 5, 6, 7, 8, 9, 10, 11, 12 ]
[ 5, 6, 7, 8, 9, 10, 11, 12, 13 ]
[ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 ]
[ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ]
[ 10, 11, 12, 13, 14, 15 ]
[ 10, 11, 12, 13, 14, 15, 16 ]
[ 10, 11, 12, 13, 14, 15, 16, 17 ]
...
但相反,这是我的输出:
[ 0 ]
[ 0, 1 ]
[ 0, 1, 2 ]
[ 0, 1, 2, 3 ]
[ 0, 1, 2, 3, 4 ]
[ 0, 1, 2, 3, 4, 5 ]
[ 0, 1, 2, 3, 4, 5, 6 ]
[ 0, 1, 2, 3, 4, 5, 6, 7 ]
[ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
我能够通过在每次切片后添加exports.history = history
来解决问题,这意味着切片调用以某种方式改变了导出的引用,但我不知道为什么会这样。有人可以向我解释这种行为吗?
由于
答案 0 :(得分:0)
您只是更新本地变量而不是导出值。
改变这个:
exports.history = history = history.slice(5)
需要这样做的原因是array.slice()
返回数组部分的副本,并且在模块外部不可见(exports.history
仍然引用原始模块数组)。