編集:私のこの質問は、非常に不適切であることが判明しました。特にコメントを読むと、考えの材料になるかもしれないと今でも信じていますが、それを閉じるのに十分な投票が得られれば、理解できます.
JavaScript で call/cc をエミュレートすることによってコール スタックをアンワインドする方法に関する非常に興味深い論文のいくつかの研究中に (継続とコールバックの違いは何ですか? ) 私は、主に使用される方法の根本的な改善と思われるものに直面しました。 JS 関数呼び出しを非同期にする。
最も一般的な方法はsetTimeout(fun, 0)
. fun
この構成により、現在の実行スレッドから の呼び出しが取り出され、イベント キュー内の他のジョブが実行できるようになります。ただし、順番が来ると、fun
すべての状況でコール スタック全体を維持します。
しかし、上記の論文がそうであるように、コードが に変更され、継続渡しスタイル(記憶する命令がない) でsetTimeout.bind(null, fun, 0)
プログラミングしている場合、 のコール スタックはクリアされ、深さ 1 に戻されます。return
fun
例でこれらすべての動作を確認できます。Chrome、FF、IE、Opera で検証済み。
サンプル HTML ページは、開発者ツールを開いた状態でダウンロードしてブラウザーで実行するのが非常に簡単です。行 18 と行 42 に 2 つの一時停止命令があり、ここで の 2 つの呼び出しによって維持されるコール スタックの違いを確認できますsetTimeout
。
問題は、単純な呼び出しsetTimeout.bind()
とは根本的に異なる振る舞いをするのはなぜですか? setTimeout
誰かが何が起こっているのか説明できますか?