Javascript 最后在试块内做清理,用回试块-不好的做法?
我有以下代码来计算一些文本的宽度:Javascript 最后在试块内做清理,用回试块-不好的做法?,javascript,try-finally,Javascript,Try Finally,我有以下代码来计算一些文本的宽度: function textWidth(text, font) { const span = document.createElement('span') try { span.style.cssText = `position: absolute; opacity: 0; font: ${font || "'Arial'"};` span.innerText = text document.bod
function textWidth(text, font) {
const span = document.createElement('span')
try {
span.style.cssText = `position: absolute; opacity: 0; font: ${font || "'Arial'"};`
span.innerText = text
document.body.appendChild(span)
return span.offsetWidth
} finally {
document.body.removeChild(span)
}
}
当try块返回某些内容时,最后在内部进行清理是否是一种不好的做法?它按预期工作;这个问题不是关于如何尝试……最后,我明白了。我只是想知道,出于某种原因,是否最好将宽度存储在变量中,进行清理,然后返回变量
当try块返回某些内容时,最后在内部进行清理是否是一种不好的做法
不,这是完全正常的做法
当您返回span.offsetWidth时,将计算span.offsetWidth
的值并将其放在一边,然后运行最后的代码,然后返回该值。不需要手动操作。您的最终
甚至可能有span=null它不会影响您的返回值,因为表达式span.offsetWidth
已在该点上求值
您可以从以下内容中看到:
运行时语义:评估
ReturnStatement:return
表达式
让exprRef作为计算表达式的结果
让EXPREVALUE是什么?获取值(exprRef)
如果!GetGeneratorKind()是异步的,是否将exprValue设置为?等待(导出值)
返回完成{[[Type]]:返回,[[Value]]:exprValue,[[Target]]:empty}
在该摘录中,值位于exprValue
,它成为完成记录的一部分(这是一种规范机制,不一定是真实的);然后运行finally
代码,函数使用该完成记录完成(当然,除非finally
抛出或发出一个不同的return
,该return
)
你也可以观察它:
函数示例(){
让foo=()=>{
log(“foo调用”);
返回42;
};
试一试{
log(“Doing:return foo();”;
返回foo();
}最后{
log(“finally block,doing foo=null”);
foo=null;
}
}
log(示例())代码>