"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)
下面是 运行 来自循环的一系列测试的代码。它正在产生一些意想不到的行为。似乎第一个操作的 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)