2016-10-18 146 views
1

我一次又一次地使用switch語句。每當我經常發現自己想在我的函數中使用return語句。我想知道用這種方式編寫的switch語句是否仍然是tail-call優化的。switch語句是否遞歸?

function misc(x) { 
    switch(true){ 
     case x > 1: 
      return misc(x-1); 
      break; 
     default: 
      return; 
    } 
} 

需要什麼改變,使case x > 1尾調用優化。是否可以使用switch陳述或我不得不使用其他類似if陳述?

注:我知道在大多數主流瀏覽器中,JavaScript不支持tail-call優化。我主要只是想知道如果上面的代碼甚至可以兼容tail-call優化,無論當前的瀏覽器是否支持它。

回答

3

ES6中尾部呼叫優化的要求僅取決於函數調用處於尾部位置的天氣 - 也就是說,函數是返回之前執行的最後一件事。

你的情況:

return misc(x-1); 

misc()在尾部位置。因此可以進行尾部呼叫優化。

哪裏也不會發生的情況是,如果你是做這樣的事情:

return 1 + misc(x-1); 

這是因爲這將是等效於:

var tmp = misc(x-1); 
tmp = 1 + tmp; 
return tmp; 

這意味着misc()不會處於尾部位置。

所以它並不重要,如果return處於ifwhileswitch,只要該函數是在尾部位置也可以是尾部調用優化。

+0

現在我覺得一口傻了。我應該知道這一點。謝謝。 – Ucenna