概要
ある関数Aから別の関数Bを呼び出すとき、処理系は後で戻って来れるように一旦Aの状態を保存し、関数Bの処理に入る。
これが問題になるのは再帰の時で、数万回程度の再帰でスタックが一杯になり、エラーとなってしまう。
しかし、もし関数B呼び出しの際に、関数Aに戻ってきて処理を続ける必要のない形で呼びだされていれば、
状態の保存を省略して関数Bに移行する最適化が可能であり、ES2015でその詳細が定義されることとなった。
例
具体的には、strictモードの関数で、「 return fn() 」という形での呼び出しについて最適化が有効になる。
最適化が効く例:
function fn( i ) { 'use strict' if ( i <= 0 ) { return 'done!' } return fn( i - 1 ) // この関数がする処理はこれ以上ない } fn( 1e6 ) // "done!"
最適化が効かない例:
function fn( i ) { 'use strict' if ( i <= 0 ) { return 'done!' } fn( i - 1 ) // returnがないと、undefinedを返すという処理が残ってしまう } fn( 1e6 ) // RangeError
注意
デバッガが起動していると最適化が無効になるので、
ブラウザのコンソールで試す際は、
setTimeout( `( function () { 'use strict' ~~テストコード~~ } )()`, 2000)
の形で実行し、すぐ閉じてまた開くと良い。
実装されるバージョン
V8 4.10.69