为什么我的导出在它引用的数组被切片时会停止更新?

时间:2017-08-18 02:54:39

标签: node.js module

我已经使用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来解决问题,这意味着切片调用以某种方式改变了导出的引用,但我不知道为什么会这样。有人可以向我解释这种行为吗?

由于

1 个答案:

答案 0 :(得分:0)

您只是更新本地变量而不是导出值。

改变这个:

exports.history = history = history.slice(5)

需要这样做的原因是array.slice()返回数组部分的副本,并且在模块外部不可见(exports.history仍然引用原始模块数组)。