异常后清理(如Eloquent JavaScript中所述)

时间:2018-03-28 02:04:45

标签: javascript

在第17页的Eloquent JavaScript第一版中,第61章下面有以下代码"在例外情况下清理"

var currentThing = null;

function processThing(thing) {
    var prevThing = currentThing;
    currentThing = thing;
    /* do complicated processing... */
    currentThing = prevThing;
}

最终将prevThing重新分配给currentThing的逻辑是什么?

此处,我们已将currentThing分配给prevThing,然后将currentThing更改为thing,那么上次重新分配的品味如何?

3 个答案:

答案 0 :(得分:1)

最后一项任务并非无用,因为currentThing是一个全局变量。

为了说明问题,作者提出了一些假设的情景,暂时在/* do complicated processing... */发生时,您希望全局公开thing的价值(通过currentThing )让别人消费。

在处理之后,作者告诉您,在这种假设情形中,您希望在处理开始之前将currentThing恢复为其值(存储在prevThing中的值)。

所有这些都发生在 错误处理 的上下文中。作者创建了这样一个复杂的场景,告诉你如果你想在一些计算后重置一些变量,你应该将计算包装在tryfinally 进行重置:

var currentThing = null;

function processThing(thing) {
    var prevThing = currentThing;
    currentThing = thing;
    try {
      /* do complicated processing... */
    } finally {
      // now you'll reset currentThing to its previous value,
      // no matter if the complicated processing errors or not
      currentThing = prevThing;
    }
}

因此,复杂处理可能引发的任何错误都不会影响currentThing的重置。

答案 1 :(得分:0)

原因是如果在/* do complicated processing... */中你想要在同一范围内调用其他函数,但由于某种原因偏好或不能将thing作为参数传递给它们,currentThing变量使对象可用于这些函数。完成复杂处理后,currentThing可以重新设置为上一个值,也可以更准确地设置null

答案 2 :(得分:0)

这将显示所有迭代的[null,n]。所以这可能是代码中的错误。

var currentThing = null;

function processThing(thing) {
  var prevThing = currentThing;
  currentThing = thing;

  console.log(prevThing, currentThing);

  currentThing = prevThing;
}

var data = [1,2,3,4,5,6,7];

data.forEach(processThing);

如果要从prev迭代访问项目,则需要稍微更正一下。

var prevThing = null;

function processThing(currentThing) {
  /* do complicated processing... */
  console.log(prevThing, currentThing);

  prevThing = currentThing;
}

var data = [1,2,3,4,5,6,7];

data.forEach(processThing);