読者です 読者をやめる 読者になる 読者になる

JS.next

JavaScriptの最新実装情報を追うブログ

明示的な末尾呼び出し最適化構文が実装された

概要

ES2015で特定の形で関数呼び出しがされている場合に末尾呼び出し最適化が行われるよう定められたが、
パフォーマンスや、デバッグなどの実装上の問題が浮上したため、それを解決するための新たな構文がV8で実装された。
(※提案初期段階の仕様のため、この先廃止になったり仕様が大きく変わる可能性が大いにあります)


説明

具体的には、strictモードの是非を問わず、「 return continue fn() 」という形での呼び出しについて最適化が有効になる。
(詳細は明示的でない末尾呼び出し最適化の記事をご覧ください)


最適化が効く例:

function fn( n ) {
  'use strict'
  if ( n <= 0 ) {
    return 'done!'
  }
  return continue fn( n - 1 ) 
}

fn( 1e6 )  // "done!" 


最適化が効かない例:

function fn( n ) {
  'use strict'
  if ( n <= 0 ) {
    return 'done!'
  }
  try {
    return continue fn( n - 1 )
  } finally {

  }
}
// SyntaxError

// fn関数が例外を吐けばfinally節に飛ぶ可能性があるので末尾呼び出し最適化は効かない。
// このreturn-continue構文を使っているとうっかりそういった書き方をしてしまった場合に、
// 単に最適化が無効になるのではなく構文エラーにしてくれる。


実装されるバージョン

V8 5.2.146