鉴于以下两个代码片段,为什么事务对象在工作案例中可见但在另一个案例中不可见?
工作案例:
return db.transaction(function(transaction) {
return co(function*() {
// transaction is visible, do something with it -> works
}
}
不工作案例:
var c = co(function*() {
// transaction is NOT visible -> does not work!
});
return db.transaction(function(transaction) {
return c;
});
是否可以在第二种情况下使交易可见?
答案 0 :(得分:3)
为什么交易对象在工作案例中可见但在另一种情况下不可见?
闭包。当函数对象创建时,它只捕获周围范围内的所有变量。在第一种情况下,当创建生成器函数时,它在周围范围内有一个名为transaction
的变量。因此,当实际调用它时,范围内可以使用transaction
。
但在第二种情况下,当创建生成器函数时,transaction
不可用。
要解决此问题,您需要显式传递transaction
对象。也许是这样的
function c(transaction) {
return co(function*() {
// transaction will be available now
});
}
return db.transaction(function(transaction) {
return c(transaction);
});
答案 1 :(得分:0)
这是因为函数范围的工作原理。在工作示例中,如果transaction
函数的范围及其中的所有回调和函数,db.transaction
是一个可见变量。但是,当您在db.transaction
范围之外定义生成器函数时,生成器函数只能访问其自己的变量以及父范围中的任何变量。
您可以在此处找到有关javascript中函数范围的更多信息,例如:http://ryanmorr.com/understanding-scope-and-context-in-javascript/