1

给定以下两个代码片段,为什么事务对象在工作案例中可见但在其他情况下不可见?

工作案例:

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;
});

在第二种情况下是否可以使交易可见?

4

2 回答 2

3

为什么事务对象在工作情况下可见但在其他情况下不可见?

关闭。创建函数对象时,它只捕获周围范围内的所有变量。在第一种情况下,当生成器函数被创建时,它有一个transaction在周围范围内调用的变量。因此,当它实际被调用时,它transaction在作用域中是可用的。

但是在第二种情况下,当生成器函数被创建时,transaction是不可用的。


要解决此问题,您需要明确传递transaction对象。也许像这样

function c(transaction) {
  return co(function*() {
    // transaction will be available now
  });
}

return db.transaction(function(transaction) {
  return c(transaction);
});
于 2016-06-26T08:35:24.317 回答
0

这是因为函数作用域是如何工作的。在工作示例中,如果函数的范围以及其中的所有回调和函数,它transaction是一个可见的变量。db.transaction但是,当您在生成器函数范围之外定义生成器函数时,db.transaction只能访问其自己的变量和父范围内的任何变量。

您可以在此处找到有关 javascript 函数范围的更多信息,例如:http ://ryanmorr.com/understanding-scope-and-context-in-javascript/

于 2016-06-26T08:35:56.943 回答