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

标签 javascript

在《Eloquent JavaScript》第一版中,第 67 页的“异常后清理”子章节下有以下代码:

var currentThing = null;

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

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

这里,我们已经将 currentThing 赋值给 prevThing,然后将 currentThing 更改为 thing,那又怎样是上次重新分配的味道吗?

最佳答案

最后一个赋值并非无用,因为 currentThing 是一个全局变量。

为了说明这一点,作者提出了一些假设场景,暂时,当 /* 进行复杂处理... */ 发生时,您希望获得 的值>thing 全局公开(通过 currentThing)供其他人使用。

处理后,作者告诉我们,在这种假设场景中,您希望将 currentThing 恢复到处理开始之前的值(存储在 prevThing 中的值)。

所有这些都发生在错误处理的上下文中。作者创造了如此复杂的场景是为了告诉你,如果你想在计算后重置某个变量,你应该将计算包装在 try block 中finally中进行重置,如下所示:

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 的重置。

关于javascript - 异常后的清理(如 Eloquent JavaScript 中所述),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49524964/

相关文章:

javascript - 如何通过单击 var phraseArray 句子上的按钮来添加 css 或 javascript 可重复打字机效果?

javascript - 确定在 jquery 中选择的元素的类型

javascript - 创建匿名函数时变量的范围

javascript - 如何更改输入值onfocus和onblur(无jquery)

javascript - 在快速应用程序中调试内存泄漏

javascript - 带有 base64 数据 uri 的 PDF.JS 在 safari 上不起作用

javascript - 单击浏览器后退按钮导致 'Document Expired issue'

javascript - 从客户端获取文本 Controller 值

javascript - 如何减少 XMLHttpRequest 时滞?

javascript - 在 ajax 调用之前调用 return 语句