Javascript 使导入的函数使用新变量

Javascript 使导入的函数使用新变量,javascript,node.js,unit-testing,Javascript,Node.js,Unit Testing,我正在尝试为我的一个旧应用程序编写一些单元测试。 我当时没有想到我会在主文件之外使用函数,所以我在其中使用了很多局部变量。我的问题是,在导入它们之后,它们试图使用来自其他范围的变量。有没有办法让他们在不更改旧文件的情况下使用新的作用域 \\foo.js let arr exports.foo = function foo() { return arr[0] } \\foo.test.js let arr = ['bar'] let foo = require('../test/supr

我正在尝试为我的一个旧应用程序编写一些单元测试。 我当时没有想到我会在主文件之外使用函数,所以我在其中使用了很多局部变量。我的问题是,在导入它们之后,它们试图使用来自其他范围的变量。有没有办法让他们在不更改旧文件的情况下使用新的作用域

\\foo.js

let arr
exports.foo = function foo() {
  return arr[0]
}

\\foo.test.js

let arr = ['bar']
let foo = require('../test/supreme.spec.js').foo
console.log(foo())//undefined, want 'bar'

我知道这可能是一个非常糟糕的做法,但这是一个旧代码,我现在不想弄乱它。

不幸的是,这是不可能的,因为函数的闭包和词法环境。函数“记住”与它在中创建时在同一范围内的所有变量,因此,除非这些变量是该函数的属性,否则无法从外部访问它们。这就是在面向对象Javascript中实现封装的原因。

范围在模块之间是隔离的,但是您可以添加一个带有默认值的参数

exports.foo = function foo(arr = ['test data 1', 'test data 2']) {
  return arr[0]
}
然后它可以被称为
foo()
,但也可以被称为
foo(['other data'))

您可以使用。它是专门为这种情况设计的:

let rewire = require('rewire')

let fooModule = rewire('../lib/foo.js')

fooModule.__set__('arr', [ 'bar' ])
console.log(fooModule.foo()) // bar