"describe" 和 "it" 语句中的变量范围

Variable Scope Within "describe" and "it" Statements

下面是 运行 来自循环的一系列测试的代码。它正在产生一些意想不到的行为。似乎第一个操作的 args 范围正在泄漏到第二个操作中。换句话说,由于某种原因 callback 存在于 args 中用于第二个操作。

describe("symlinkType", function() {
  tests.success.forEach(function (test) {
    var args = test[0]
    var expectedType = test[1]
    var should = util.format('should return \'%s\' when src \'%s\'', expectedType, args[0])
    it(should, function (done) {
      var callback = function (err, type) {
        if(err) done(err)
        expect(type).to.equal(expectedType)
        done()
      }
      args.push(callback)
      return symlinkType.apply(null, args)
    })
  })
})

describe("symlinkTypeSync", function()  {
  tests.success.forEach(function (test) {
    var args = test[0]
    var expectedType = test[1]
    var should = util.format('should return \'%s\' when src \'%s\'', expectedType, args[0])
    it(should, function () {
      var value = symlinkTypeSync.apply(null, args)
      expect(value).to.equal(expectedType)
    })
  })
})

我想知道这种行为的原因以及如何解决它。我习惯于当你声明一个变量时它会改变变量的值并且随后的 .push() 调用不应该影响第二个语句中的 args 变量。这是 mocha 的错,是 it 语句泄漏作用域吗?

正如评论者@KirillSlatin 提到的那样,var args=test[0] 只是对 test[0] 数组对象的引用,因此当我 .push() 回调进入数组时,它会将其推入原始数组。然后,当我在后续函数中调用 test[0] 时,它会拉取更新的对象。这可以通过 "cloning" 数组对象来防止,这会创建一个新对象而不是仅仅创建一个引用。

var args = test[0].slice(0)