在第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
,那么上次重新分配的品味如何?
答案 0 :(得分:1)
最后一项任务并非无用,因为currentThing
是一个全局变量。
为了说明问题,作者提出了一些假设的情景,暂时在/* do complicated processing... */
发生时,您希望全局公开thing
的价值(通过currentThing
)让别人消费。
在处理之后,作者告诉您,在这种假设情形中,您希望在处理开始之前将currentThing
恢复为其值(存储在prevThing
中的值)。
所有这些都发生在 错误处理 的上下文中。作者创建了这样一个复杂的场景,告诉你如果你想在一些计算后重置一些变量,你应该将计算包装在try
块和按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
的重置。
答案 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);