在《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/