2017-06-25 30 views
2

是否調用bar尾部位置?Try/catch和尾部位置(ES6)

function foo() { 
    try  { return bar() } 
    catch(err) { <do-something> }   
} 

我試圖在ES6中找到答案,但沒有找到我正在尋找的東西。

UPDATE

菲利克斯克林點到標準的這一部分:

TryStatement : try Block Catch 
    1. Return HasProductionInTailPosition of Catch with argument nonterminal. 

TryStatement: tryBlockFinally 
TryStatement: tryBlockCatchFinally 
    1. Return HasProductionInTailPosition of Finally with argument nonterminal. 

Catch : catch (CatchParameter) Block 
    1. Return HasProductionInTailPosition of Block with argument nonterminal. 

這意味着,在示例中的呼叫至bar不在末尾位置。

+0

看起來不像它:https://www.ecma-international.org/ecma-262/7.0/#sec-statement-rules。但我可能是錯的。 –

+0

感謝您的指針。 – soegaard

+1

海事組織的答案不屬於這個問題。 –

回答

4

尾部位置可以定義爲函數的最終操作。

在這種情況下,try/catch的問題是try中的最後一條語句和catch中的最後一條語句都可以被視爲尾的分支。考慮到這一點,我會說答案是否定的,bar不在尾部位置。我們可以說雖然bar是在try塊本身內的尾部呼叫 - 每個塊可以有它自己的尾部呼叫,這取決於我們如何嚴格定義尾部是什麼。

此處的另一個含義是,當使用try/catch時,我們必須能夠在調用堆棧下的任意點跳回catch塊。這意味着也不能有尾部優化,因爲我們必須維護必要的調用堆棧。

+0

我同意有必要存儲執行必須進行的地方的信息,以防萬一拋出異常 - 並且這對於調用'bar'的尾部來說是有問題的。整個堆棧不是必需的 - 只需要導致執行'foo'的堆棧(但我想這一點是沒有意義的:-)) – soegaard

+0

@soegaard哈哈但是你是對的,我糾正了我的答案: ) – nem035